我试图编写点光阴影功能。我首先使聚光灯阴影工作,但是当我切换到点光阴影时(通过使用立方体贴图,渲染6 POV等的深度......)我现在得到一个方格图案的光(没有阴影)。有没有人对这可能是什么有直觉?
这是一个截图:
(请注意,如果仔细观察,可以清楚地看到立方体贴图正在三角形右侧立方体的正面进行渲染)
这里是我的渲染过程片段着色器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
}
谢谢!
修改 好的,所以我一直在玩它,现在纹理似乎是随机的......
所以这让我觉得深度立方体充满了噪音?但这似乎不太可能,因为对于带有samplerCubeShadow返回1.0的texture()函数,该点的值必须完全是该片段深度的值......对吗?此外,我设置了控制灯的位置与wasd +向上+向下,并且图案随着光的移动而移动(当我备份时,它变得更大/更暗)。这意味着值必须动态变化以匹配实际距离?噢,我很困惑......
编辑2 好的,对不起,这个问题已经失控了,但我想我会继续记录我的进展,以便将来遇到类似的问题。
无论如何,我现在已经发现无论我把4d矢量的第4个分量传递给带有shadowcubemap的texture(),我都会得到相同的结果。就像,我甚至可以放一个常数,我得到完全相同的结果。怎么可能?
编辑3 该死。原来这个错误与我刚刚说的任何事情无关。有关详细信息,请参阅以下答案:(
答案 0 :(得分:0)
织补。事实证明我只是个傻瓜。我只是以错误的顺序渲染事物 - 毕竟,着色器代码没有任何问题。所以,棋盘只是纹理中的噪音。噪音仍然呈现的原因是因为我正在使用GL_TEXTURE_COMPARE_FUNC GL_LEQUAL(因为我应该)并且噪音远低于1或远高于1,所以我移动灯光无关紧要。