javascript - ivec2 未在带有 gl 过渡的 webgl 滑块上定义
问题描述
我正在使用一个使用不同转换的 webgl 滑块,您也可以使用自己的转换。使用的过渡来自 https://gl-transitions.com/,我想使用的是这个: https ://gl-transitions.com/editor/randomsquares
问题是我得到ivec2 未定义的错误...... webgl 的新手......
我已经实现了其他效果,但我不明白如何处理 ivec2。它是一个数组吗?
const uniforms = {
size: ivec2(10, 10),
smoothness: 0.5
};
const shader = [
'uniform ivec2 size; // = ivec2(10, 10)',
'uniform float smoothness; // = 0.5',
'float rand (vec2 co) {',
'return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);',
'}',
'vec4 transition(vec2 p) {',
'float r = rand(floor(vec2(size) * p));',
'float m = smoothstep(0.0, -smoothness, r - (progress * (1.0 + smoothness)));',
'return mix(getFromColor(p), getToColor(p), m);',
'}'
].join( '\n' );
GLSlideshow.addShader( 'myShader', shader, uniforms );
loader.whenReady = function() {
var slideshow = new GLSlideshow(
[ 'img/1.jpg', 'img/2.jpg', 'img/3.jpg', 'img/4.jpg' ],
{
canvas: document.getElementById( 'myCanvas' ), // optional
width: 1024, // optional
height: 576, // optional
duration: 5000, // optional
interval: 3000, // optional
effect: 'myShader'
}
);
}
解决方案
【看源码】(看源码)没有对ivec2的支持。
此外,第二行size: ivec2(10, 10)
来自某个库或者是您编写的一些代码,与 WebGL 无关。JavaScript中没有这样的东西ivec2
。它与您正在使用的库或您自己的代码有关。
简单的解决方案,在着色器中使用size: [10, 10]
每一个ivec2
来更改。vec2
const uniforms = {
size: [10, 10],
smoothness: 0.5
};
const shader = `
uniform vec2 size; // = vec2(10, 10)
uniform float smoothness; // = 0.5
float rand (vec2 co) {
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
vec4 transition(vec2 p) {
float r = rand(floor(vec2(size) * p));
float m = smoothstep(0.0, -smoothness, r - (progress * (1.0 + smoothness)));
return mix(getFromColor(p), getToColor(p), m);
}
`;
GLSlideshow.addShader( 'myShader', shader, uniforms );
// since we can't use images because gl-slideshow doesn't support CORS
// let's use canvases
var slideshow = new GLSlideshow(
[
makeImage('A', 'red', 'cyan'),
makeImage('B', 'green', 'magenta'),
makeImage('C', 'blue', 'yellow'),
makeImage('D', 'black', 'white'),
],
{
canvas: document.getElementById( 'myCanvas' ), // optional
duration: 1000, // optional
interval: 2000, // optional
effect: 'myShader'
}
);
// ----------------------------
function makeImage(str, bg, fg) {
const ctx = document.createElement('canvas').getContext('2d');
ctx.canvas.width = 128;
ctx.canvas.height = 128;
ctx.fillStyle = bg;
ctx.fillRect(0, 0, 128, 128);
ctx.fillStyle = fg;
ctx.font = "bold 110px sans-serif";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(str, 64, 64);
return ctx.canvas.toDataURL(); // gl-slideshow doesn't handle canvas so we need to make a data URL
}
<script src="http://unpkg.com/GLSlideshow@2.1.0/dist/gl-slideshow.js"></script>
<canvas id="myCanvas"></canvas>
推荐阅读
- flutter - 使用 Pageview.builder 在 Flutter 中进行分页
- python - 如何重复删除不同名称的项目
- android - 以编程方式更改页面时如何减慢 ViewPager2 中的过渡动画
- python - 从 FITS 文件中仅提取几列,该文件可在线免费使用 python 下载
- python - 在 setup.py 中安装“脚本”作为 Python 包的一部分,在用户路径上并被识别为 Python 脚本
- javascript - 转到 Vue.js 中的 $router url 目的地后,如何防止我的 $router 参数消失?
- algorithm - 是否存在一种稳定的排序算法,可以以 O(n) 时间复杂度和 O(1) 辅助空间复杂度对二进制数组进行排序?
- typescript - 从打字稿中的数组中的字符串派生键以定义对象属性名称
- jupyter-notebook - 在 Jupyter 实验室中选择一行是否有键盘快捷键?
- c# - 如何在需要抽象父类型的地方使用子类型