我正在尝试编写点光阴影的功能。我首先让聚光灯阴影工作,但是当我切换到点光阴影(通过使用立方体贴图、从 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 的 texture() 函数返回 1.0,该点的值必须完全是该片段的深度值......对吗?另外,我将它设置为用 wasd+up+down 控制灯光的位置,并且图案随着灯光的移动而移动(当我备份时,它会变大/变暗)。这意味着这些值必须动态变化以匹配实际距离?哦,伙计,我很困惑...
编辑 2 好的,抱歉,这个问题已经失控,但我想我会继续记录我的进展,以便将来遇到类似问题的人。
无论如何,我现在发现无论我将 4d 矢量的第 4 个分量与 shadowcubemap 一起传递给纹理(),我都会得到相同的结果。就像,我什至可以输入一个常数,得到完全相同的结果。这怎么可能?
编辑 3 该死。原来这个错误与我刚才所说的任何事情都没有关系。有关详细信息,请参阅下面的答案:(