使用带有多重采样延迟渲染中断的sampler2DShadow

时间:2014-01-12 07:25:44

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

正如标题所述,使用sampler2DShadow导致我的多重采样FBO的光照着色器出错,但由于使用标准延迟渲染设置而没有多重采样的配置非常相似,我无法检测到问题,这很好。< / p>

在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(灯光深度视图编程):

vec4 coord = gLight.mDepthVP * vec4(worldPos, 1.0);

1 个答案:

答案 0 :(得分:0)

好吧,几乎把我的头发拉出来,拼命寻找一个关于为什么会出现这个问题的提示,我终于想出来了,但我不完全确定它为什么会引起这个问题。

在几何体通过期间(在光照通过之前),模型将呈现为您所期望的位置,颜色(漫反射),法线和深度模板。在此过程中,绑定的纹理(网格的漫反射纹理)但仅作为单位零处的标准纹理(GL_TEXTURE_2D)(GL_TEXTURE0)(我现在只使用漫反射)。

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

由于某些原因,这并没有覆盖几何传递中先前绑定的单位并导致GL_INVALID_OPERATION错误。致电后:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0); 
几何过后直接问题就消失了。

我问的问题归结为“问为什么不覆盖?”