【问题标题】:Using sampler2DShadow with multisampled deferred rendering breaks使用带有多重采样延迟渲染中断的 sampler2DShadow
【发布时间】:2014-01-31 01:53:04
【问题描述】:

如标题所述,使用 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);

【问题讨论】:

  • 不,运行时着色器中的越界获取不会抛出或标记任何错误状态。在这种情况下,GL 唯一能够创建错误的时间是在编译/链接期间......它可能能够进行一些静态分析以确定访问是否超出范围。但这不会发生在多样本提取中,如果您提取超出范围的内容,结果实际上是未定义的。
  • 这个GL_INVALID_OPERATION 很可能是尝试使用不完整的 FBO 进行绘制的结果。如果您可以更新您的问题以包含 glCheckFramebufferStatus (...) 的结果和您的 FBO 设置,那将非常有帮助。此外,您的 full 着色器(或至少是您的制服的声明)。
  • 重生,Stack Overflow 的“Deferred”标签有特定的含义。你确定在这种情况下是正确的吗?我认为这可能是错误的,但我没有足够的信心自己删除它。请检查一下好吗?
  • @Beetroot-Beetroot:你是对的,正确的标签是deferred-rendering
  • 啊哈,看起来好多了,谢谢安东。

标签: c++ opengl glsl multisampling deferred-rendering


【解决方案1】:

好吧,在几乎拼命地寻找一个关于为什么会发生这个问题的提示之后,我终于弄明白了,但我不完全确定它为什么会导致这个问题。

在几何通道期间(光照通道之前),模型被渲染到您所期望的位置、颜色(漫反射)、法线和深度模板。在此传递期间,绑定的纹理(网格的漫反射纹理)但仅作为标准纹理 (GL_TEXTURE_2D) 在单元零 (GL_TEXTURE0) 处(我现在只使用漫反射)。

系统工作时我就这样离开了,因为光照通道在绑定四个 FBO 纹理以供读取时会覆盖该单元。然而,在多重采样 FBO 中,它们被绑定为多重采样纹理 (GL_TEXTURE_2D_MULTISAMPLE),而“位置”贴图恰好使用了零单元 (GL_TEXTURE0)。

由于某种原因,这并没有覆盖几何通道中先前绑定的单元,并导致 GL_INVALID_OPERATION 错误。调用后:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0); 

几何通过后问题就消失了。

我问的问题归结为“为什么它没有覆盖?”

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多