我正在编写简单的延迟渲染'引擎'为了好玩,并遇到了GLSL的奇怪行为。调用函数会导致轻微故障,而只需粘贴函数内容即可解决问题(详情如下)。 我做了一些非常错误的事情,或者我是否有可能遇到限制或glsl编译器错误(14.12 AMD Catalyst Omega驱动程序)?
原始通话(在shadow
上方的for循环中):
ColorOut.rgb += phong(position.xyz, normal, color, Shadows[shadow].position.xyz, Shadows[shadow].color.rgb);
使用它,我的阴影投射灯的颜色都是一样的,阴影[阴影] .color.rgb似乎总是等于第一个数组(至少在phong函数中)。 我的解决方案'是用函数的内容替换调用:
vec3 L = normalize(Shadows[shadow].position.xyz - position.xyz);
float dNL = dot(normal, L);
float diffuseFactor = max(dNL, minDiffuse);
vec3 V = normalize(cameraPosition - position.xyz);
vec3 R = normalize(reflect(-L, normal));
float specularFactor = pow(max(dot(R, V), 0.f), 8.0);
ColorOut.rgb += diffuseFactor * color * Shadows[shadow].color.rgb + specularFactor * Shadows[shadow].color.rgb;
有了这个,一切正常。 其他相关代码片段,阴影投射灯数据结构:
layout(std140, binding = 2) uniform ShadowBlock
{
vec4 position;
vec4 color;
mat4 depthMVP;
} Shadows[8];
phong功能:
vec3 phong(vec3 p, vec3 N, vec3 diffuse, vec3 lp, vec3 lc)
{
vec3 L = normalize(lp - p);
float dNL = dot(N, L);
float diffuseFactor = max(dNL, minDiffuse);
vec3 V = normalize(cameraPosition - p);
vec3 R = normalize(reflect(-L, N));
float specularFactor = pow(max(dot(R, V), 0.f), 8.0);
return diffuseFactor * diffuse * lc + specularFactor * lc;
}