GLSL(用户定义)函数参数和统一块奇怪的行为

时间:2014-12-25 18:15:15

标签: opengl glsl shader uniform

我正在编写简单的延迟渲染'引擎'为了好玩,并遇到了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;
}

0 个答案:

没有答案