0

当我像这样创建 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值不正确?

4

1 回答 1

4

这个问题花了我很长时间来解析 :) 我希望我得到了正确的答案:

这只是精度。深度分量纹理至少有 16 位的 z 值。在彩色中,每个通道只有 8 位。您可以编写类似 (z,frac(z*256.0),frac(z*256.0*256.0)) 之类的东西来写入完整的 24 位,而不是将相同的 z 写入 rgb。它看起来很奇怪,但如果你读回来,你可以用 dp3 (1,1/256,1/(256*256)) 对其进行解码。

顺便说一句,你的问题难以阅读的主要原因是我从来没有读过 fragCoord 来得到 z。我总是只使用纹理坐标来获得纹理 z。这使您可以更好地控制如何从顶点着色器生成和插入 z。

于 2013-10-15T04:53:34.293 回答