OpenGL 3.3 GLSL片段着色器雾效果不起作用

时间:2014-08-12 22:00:34

标签: opengl glsl fog

我试图在OpenGL 3.3中为我的场景添加雾效果。我试过跟this tutorial。但是,我似乎无法在屏幕上获得相同的效果。所有这一切似乎都发生在我的物体变暗,但屏幕上没有灰雾。可能是什么问题呢?

这是我的结果。

enter image description here

什么时候看起来像:

enter image description here

这是我的片段着色器,有多个光源。没有任何雾,它工作正常。所有GLSL变量都已设置并正常工作。

 for (int i = 0; i < NUM_LIGHTS; i++)
{   
    float distance = length(lightVector[i]);

    vec3 l; 

    // point light

    attenuation = 1.0 / (gLight[i].attenuation.x + gLight[i].attenuation.y * distance + gLight[i].attenuation.z * distance * distance);
    l = normalize( vec3(lightVector[i]) );

    float cosTheta = clamp( dot( n, l ), 0,1 );
    vec3 E = normalize(eyeVector);
    vec3 R = reflect( -l, n );
    float cosAlpha = clamp( dot( E, R ), 0,1 );

    vec3 MaterialDiffuseColor = v_color * materialCoefficients.diffuse;
    vec3 MaterialAmbientColor = v_color * materialCoefficients.ambient;

    lighting += vec3(
        MaterialAmbientColor
        + (
            MaterialDiffuseColor * gLight[i].color * cosTheta * attenuation
        )
        + (
            materialCoefficients.specular * gLight[i].color * pow(cosAlpha, materialCoefficients.shininess) 
        ) 
    );
}

float fDiffuseIntensity = max(0.0, dot(normalize(normal), -gLight[0].position.xyz));
color = vec4(lighting, 1.0f) * vec4(gLight[0].color*(materialCoefficients.ambient+fDiffuseIntensity), 1.0f);

float fFogCoord = abs(eyeVector.z/1.0f);
color = mix(color, fogParams.vFogColor, getFogFactor(fogParams, fFogCoord));

1 个答案:

答案 0 :(得分:2)

两件事。

首先,您应该验证您的fogParams.vFogColor值是否设置正确。最简单的方法是将着色器短路并将color设置为fogParams.vFogColor并立即返回。如果场景为黑色,则表示您的雾色未正确发送到着色器。

其次,你需要消除你的天空盒。你可以简单地用雾颜色设置glClearColor(),而不是使用天空盒,因为天空盒应该是可见的,你应该看到雾,对吗?更高级的用法可以修改天空盒着色器从雾到天空盒纹理,具体取决于vec3离水平方向的角度,所以当仰视天空(有些)可见时,但水平看起来只是显示雾,并有一个两者之间平稳过渡。