这是我的情况:
我正在使用 OpenGLES 3.0.
我正在做 z-buffer 阴影投射。但是,我还在场景中使用模板缓冲区进行了一些切割,即在地面上挖出非几何形状的“洞”。
我正在使用模板缓冲区来防止孔中出现阴影。但是,这样做的问题是,模板缓冲区会阻止场景中一直向前的阴影,所以如果有东西遮挡了这个洞但也在阴影中,我会在应该有阴影的地方看到一个没有阴影的“洞”。
所以,我的计划是有第二个 z 缓冲区,然后简单地将模板掩码写入该 z 缓冲区。当尝试绘制我的阴影通道时,我会简单地检查我的 z 值与另一个 zbuffer,如果大于或等于则跳过绘制,但如果小于则允许绘制。
但是,我似乎无法读取另一个 z 缓冲区的值并将其与 gl_FragCoord.z 进行正确比较
我想做的事:
vec2 otherZ=texture(otherZ,uv).r;
if (otherZ>=gl_FragCoord.z) discard;
但是,我没有得到一致的结果。我是否必须对另一个 z 缓冲区中的值进行某种转换? gl_FragCoord.z 与最终在 z 缓冲区中的值不同吗?
编辑补充:这是我的独立深度缓冲区的格式:
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8,mWidth,mHeight,0,GL_DEPTH_STENCIL,GL_UNSIGNED_INT_24_8, NULL);