当我像这样创建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值吗?根据{{3}}它是。绑定颜色缓冲区时纹理是否协调不一致?或者z值是否不正确?
答案 0 :(得分:4)
这个问题花了我很长时间才解析:)我希望得到正确的答案:
这只是精确度。深度分量纹理对于z值具有至少16位。在彩色方面,每个通道只有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。