如标题所述,使用 sampler2DShadow 会导致我的多重采样 FBO 的光照着色器出现错误,但由于使用标准延迟渲染设置的配置非常相似,但没有多重采样,我无法检测到该问题,这工作正常。
openlGL 中的 sampler2DShadow 和多重采样是否存在兼容性问题,或者我应该使用一些替代方案?
着色器编译良好。
代码运行良好,直到我运行这一行:
texture(gShadowMap2D, vec3(pCoord.xy, (pCoord.z) / pCoord.w));
并检索结果。然后我得到 GL_INVALID_OPERATION。
阴影贴图来自定向光(深度贴图有效且可见)并使用 GL_COMPARE_R_TO_TEXTURE,设置为标准纹理 (GL_TEXTURE_2D)。
多重采样延迟 FBO 纹理使用 GL_TEXTURE_2D_MULTISAMPLE。
我正在使用 glsl 330(openGL 3.3 核心配置文件)。
更新
我认为问题与从多采样片段着色器中的位置图获取世界位置有关。
标准方式:
vec3 worldPos = texture(gPositionMap, texCoord).xyz;
多采样方式:
vec2 texCoordMS = floor(vertTextureSize * texCoord.xy);
for(int i = 0; i < samples; i++)
{
worldPos += texelFetch(gPositionMapMS, ivec2(texCoordMS), i).xyz;
}
worldPos = worldPos / samples;
(我省略了其他采样器。)
我猜我越界了,这在尝试访问 sampler2DShadow 时会引发错误(pCoord 是使用 worldPos 计算的)。
现在要弄清楚如何让这个多重采样的 worldPos 得到与标准方式相同的结果???
标准方式 (mDepthVP = mat4 (light's depth view prog):
vec4 coord = gLight.mDepthVP * vec4(worldPos, 1.0);