正如标题所述,使用sampler2DShadow会导致我的多重采样FBO的光照着色器出现错误,但由于使用标准延迟渲染设置进行了非常类似的配置,因此无法检测到问题多重采样,工作正常。使用sampler2DShadow和多重采样延迟渲染休息
在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核心配置文件)。
UPDATE
我认为这个问题是关系到让从多采样片段着色器的位置地图世界上的地位。
的标准方式:
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(光的深度VIEW PROG):
vec4 coord = gLight.mDepthVP * vec4(worldPos, 1.0);
不,在着色器运行时提取出界不会抛出或标记任何错误状态。 GL在这种情况下唯一能够产生错误的时间是在编译/链接时间期间......它可能能够进行一些静态分析来确定访问超出范围。但是,对于多样本提取,这不会发生,如果您获取超出范围的结果,那么结果几乎是未定义的。 –
这个'GL_INVALID_OPERATION'很可能是尝试使用不完整的FBO进行绘制的结果。如果你可以更新你的问题来包含'glCheckFramebufferStatus(...)'的结果和你的FBO设置,这将是非常有用的。此外,你的***全部***着色器(或至少是你的制服的声明)。 –
重生,堆栈溢出的“延迟”标记具有特定的含义。你确定在这方面是正确的吗?我认为这可能是错误的,但我没有足够的信心自己去除。你可以检查吗? –