0

我一直在尝试编写一个简单的着色器来添加噪声。但我无法通过以下设置获得 uv 坐标。

片段着色器:

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 坐标?根据几个示例,我应该能够使用与此示例中相同的场景和相机来渲染它

4

1 回答 1

1

如果没有初始纹理,几何体将没有必要的烘焙 WebGL UV 缓冲区。

有几种解决方案,但也许最简单的方法是确保网格的第一次渲染具有纹理。一个简单的白色就可以了。

三.js r.58

于 2013-05-27T05:08:19.467 回答