【发布时间】:2016-07-29 10:08:44
【问题描述】:
我在 GeForce GTX 750 下使用 OpenGL 4.3 创建阴影贴图。现在基本效果如下图所示,似乎是正确的: 为了消除块状效果,我尝试在着色器中手动执行 2x2 PCF。它导致以下结果,这似乎也是正确的: 对于加速,我想利用显卡提供的好处,它可以一次获取比较结果的线性过滤器。但是效果和上面的不一样。 更像是 OpenGL 对阴影的渲染进行线性过滤,而不是在 Shadow Map 上进行过滤: 下面是我如何做硬件PCF: 我注意到为了使用硬件 PCF,必须做的基本两件事是:
- 使用
shadow类型的采样器,在我的例子中是samplerCubeShadow(我正在使用立方体贴图类型,因为我正在尝试创建点光源场景)。 -
设置比较模式和过滤类型,在我的例子中,是通过以下代码完成的:
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
之后,我像这样在着色器中使用texture 函数(我使用texture 而不是textureProj 的原因是因为后者似乎不支持立方体贴图阴影纹理,因为它需要vec5 类型,显然还不支持):
vec4 posInLight4D = positionsInLight / positionsInLight.w; // divided by the 4-th component)
vec3 texCoord = GetCubeMapTexCoord(posInLight4D.xy); // get the texture coordinate in cube map texture. This can be assumed correct
float lightness = texture(shadowMapHardware, vec4(texCoord, posInLight4D.z));
但不幸的是,这给出了第三张图片中显示的结果。
据我了解,通过比较模式和线性滤镜的设置,显卡会进行比较一个附近的 2x2 区域并线性插值结果并通过texture 函数返回。我想我已经完成了所有必要的部分,但我仍然无法获得第二张图片中显示的确切结果。
谁能给我任何关于我可能出错的建议?非常感谢。
ps:有趣的是:我尝试了textureGather函数,它只返回比较结果而不进行过滤,它给出了精确的结果,如第二张图所示。但这缺少自动过滤程序,显然它不是硬件 PCF 的完整版本。
【问题讨论】:
标签: opengl shadow-mapping