shadowcubemap格仔图案-glsl texture()在samplerCubeShadow上忽略向量的第四个组成部分

时间:2014-03-22 18:55:54

标签: opengl glsl shadow-mapping

我试图编写点光阴影功能。我首先使聚光灯阴影工作,但是当我切换到点光阴影时(通过使用立方体贴图,渲染6 POV等的深度......)我现在得到一个方格图案的光(没有阴影)。有没有人对这可能是什么有直觉?

这是一个截图:checkerboard screenshot

(请注意,如果仔细观察,可以清楚地看到立方体贴图正在三角形右侧立方体的正面进行渲染)

这里是我的渲染过程片段着色器glsl代码(如果你想看到剩下的,我也可以发布它,但认为这是重要的一点)

注意:我使用延迟光照,因此此传递的顶点着色器只是四边形,pos_tex,norm_tex和col_tex来自前一遍中生成的几何缓冲区。

#version 330 core

in vec2 UV;
out vec3 color;

uniform vec3 lightPosVec; //Non rotation affine

uniform sampler2D pos_tex;
uniform sampler2D col_tex;
uniform sampler2D norm_tex;
uniform samplerCubeShadow shadow_tex;
uniform sampler2D accum_tex; //the tex being drawn to

void main()
{
  vec3 lightToFragVec = texture(pos_tex, UV).xyz-lightPosVec;
  vec3 l2fabs = abs(lightToFragVec);
  float greatestMagnitudeOfLightToFragVec = max(l2fabs.x, max(l2fabs.y, l2fabs.z));
  float lightToFragDepth = ((100.0+0.1) / (100.0-0.1) - (2*100.0*0.1)/(100.0-0.1)/greatestMagnitudeOfLightToFragVec + 1.0) * 0.5;
  float shadowed = texture(shadow_tex, vec4(normalize(lightToFragVec),lightToFragDepth));

  color = 
  texture(accum_tex, UV).xyz+                                        //current value
  texture(col_tex, UV).xyz                                           //frag color
  *dot(lightPosVec-texture(pos_tex,UV).xyz,texture(norm_tex,UV).xyz) //dot product of angle of incidence of light to normal
  *(4+15*shadowed)                                                   //shadow amplification
  /max(0.000001,dot(lightToFragVec,lightToFragVec));                 //distance cutoff
}

谢谢!

修改 好的,所以我一直在玩它,现在纹理似乎是随机的...... weird display screenshot

所以这让我觉得深度立方体充满了噪音?但这似乎不太可能,因为对于带有samplerCubeShadow返回1.0的texture()函数,该点的值必须完全是该片段深度的值......对吗?此外,我设置了控制灯的位置与wasd +向上+向下,并且图案随着光的移动而移动(当我备份时,它变得更大/更暗)。这意味着值必须动态变化以匹配实际距离?噢,我很困惑......

编辑2 好的,对不起,这个问题已经失控了,但我想我会继续记录我的进展,以便将来遇到类似的问题。

无论如何,我现在已经发现无论我把4d矢量的第4个分量传递给带有shadowcubemap的texture(),我都会得到相同的结果。就像,我甚至可以放一个常数,我得到完全相同的结果。怎么可能?

编辑3 该死。原来这个错误与我刚刚说的任何事情无关。有关详细信息,请参阅以下答案:(

1 个答案:

答案 0 :(得分:0)

织补。事实证明我只是个傻瓜。我只是以错误的顺序渲染事物 - 毕竟,着色器代码没有任何问题。所以,棋盘只是纹理中的噪音。噪音仍然呈现的原因是因为我正在使用GL_TEXTURE_COMPARE_FUNC GL_LEQUAL(因为我应该)并且噪音远低于1或远高于1,所以我移动灯光无关紧要。