2014-01-12 124 views
0

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

不,在着色器运行时提取出界不会抛出或标记任何错误状态。 GL在这种情况下唯一能够产生错误的时间是在编译/链接时间期间......它可能能够进行一些静态分析来确定访问超出范围。但是,对于多样本提取,这不会发生,如果您获取超出范围的结果,那么结果几乎是未定义的。 –

+0

这个'GL_INVALID_OPERATION'很可能是尝试使用不完整的FBO进行绘制的结果。如果你可以更新你的问题来包含'glCheckFramebufferStatus(...)'的结果和你的FBO设置,这将是非常有用的。此外,你的***全部***着色器(或至少是你的制服的声明)。 –

+0

重生,堆栈溢出的“延迟”标记具有特定的含义。你确定在这方面是正确的吗?我认为这可能是错误的,但我没有足够的信心自己去除。你可以检查吗? –

回答

0

好了,经过近拉我的头发拼命寻找一个提示,为什么这个问题是怎么回事,我终于想通了,但我不完全确定它为什么会导致这个问题

在几何通过期间(光照通过之前),将模型渲染到位置,颜色(漫反射),法线和深度模板期望,在这个过程中,绑定纹理(网格的漫反射纹理),但仅在单位zer中作为标准纹理(GL_TEXTURE_2D) o(GL_TEXTURE0)(我现在只使用diffuse)。

当系统正常工作时,我将它保留下来,因为当它绑定四个FBO纹理进行读取时,光线通过将覆盖该单元。但是,在多重采样FBO中,它们被绑定为多重采样贴图(GL_TEXTURE_2D_MULTISAMPLE),并且恰好“位置”贴图使用了单位零(GL_TEXTURE0)。

由于某些原因,这并未覆盖来自几何通道的先前绑定的单位,并导致了GL_INVALID_OPERATION错误。致电后:

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

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

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