当我像这样创建 z-buffer 纹理时:
gl.bindTexture(GL_TEXTURE_2D, texBuff);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
gl.texImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, frameBuff.width, frameBuff.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, null);
我得到了一个合适的 z 缓冲区,然后我可以将其用于阴影(并且我的阴影渲染得很好)。但是,如果我创建一个颜色纹理,并使用 z 值为纹理着色,我的阴影会有很多伪影(即使偏差很大)。颜色缓冲区是这样创建的:
gl.bindTexture(GL_TEXTURE_2D, colorBuff);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frameBuff.width, frameBuff.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, null);
这是写入颜色缓冲区的片段着色器程序:
precision highp float;
void main() {
float z = gl_FragCoord.z;
gl_FragColor = vec4(z, z, z, 1.0);
}
当我将这两个纹理渲染到某个表面时,它们看起来很相似。
所以我的问题是,为什么我的颜色纹理不起作用?gl_FragCoord.z 不是写入 z 缓冲区的正确 z 值吗?根据http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml它是。绑定颜色缓冲区时,纹理协调是否不同?还是z值不正确?