0

我正在尝试编写点光阴影的功能。我首先让聚光灯阴影工作,但是当我切换到点光阴影(通过使用立方体贴图、从 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 该死。原来这个错误与我刚才所说的任何事情都没有关系。有关详细信息,请参阅下面的答案:(

4

1 回答 1

0

该死。原来我只是个傻瓜。我只是以错误的顺序渲染事物——毕竟着色器代码没有任何问题。所以,棋盘只是来自纹理中的噪音。仍然渲染噪点的原因是因为我使用了 GL_TEXTURE_COMPARE_FUNC GL_LEQUAL(我应该这样做),并且噪点远低于 1 或远高于 1,所以我将灯光移动到哪里都没关系。

于 2014-03-22T21:22:49.207 回答