我一直在尝试编写一个简单的着色器来添加噪音。但我无法通过以下设置获得紫外线坐标。
Fragment Shader:
uniform float seed;
uniform sampler2D pass;
varying vec2 vUv;
void main (){
//noise
vec2 pos = gl_FragCoord.xy;
pos.x *= seed;
pos.y *= seed;
float lum=fract(sin(dot(pos ,vec2(12.9898,78.233))) * 434658.5453116487577816842168767168087910388737310);
vec4 tx = texture2D(pass, vUv);
gl_FragColor = vec4(tx.r*lum,tx.g*lum,tx.b*lum,1.0);
}
顶点着色器:
varying vec2 vUv;
void main (){
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
}
渲染:
OBJECT.material = OBJECT.mat.flat; // THREE MeshPhongMaterial ({color: 0xE40D59,shading:THREE.FlatShading});
RENDERER.render(SCENE,CAMERA,BEAUTY_PASS,false);
OBJECT.material = OBJECT.mat.noise; // THREE ShaderMaterial
RENDERER.render(SCENE,CAMERA);
我收到以下错误:
错误:WebGL:DrawElements:绑定的顶点属性缓冲区没有 来自绑定元素数组@的给定索引的足够大小 http://threejs.org/build/three.min.js:439
我做了一些测试,我可以通过为所有像素选择相同的坐标来运行它
vec4 tx = texture2D(pass, vec2(0.5,0.5));
以红色嘈杂的颜色显示我的对象,但如果删除第一个渲染过程(RENDERER.render(SCENE,CAMERA,BEAUTY_PASS,False)
),则vUv变量可以正常工作。
为什么我无法在第二次渲染时获得uv坐标?根据几个例子,我应该可以使用相同的场景和相机来渲染它,就像在这个example
中一样答案 0 :(得分:1)
如果没有初始纹理,几何体将没有必要的烘焙WebGL UV缓冲区。
有几种解决方案,但也许最简单的方法是确保网格的第一次渲染具有纹理。一个简单的白色会做。
three.js r.58