繁体   English   中英

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

[英]OpenGL 3.3 GLSL Fragment Shader Fog effect not working

我正在尝试在OpenGL 3.3中为场景添加雾化效果。 我尝试按照本教程进行操作 但是,我在屏幕上似乎无法获得相同的效果。 似乎发生的一切是我的物体变暗了,但屏幕上没有灰色的雾气。 可能是什么问题呢?

这是我的结果。

在此处输入图片说明

何时应如下所示:

在此处输入图片说明

这是我的带有多个光源的片段着色器。 它工作正常,没有任何雾气。 所有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));

两件事情。

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

其次,您需要消除天空盒。 您可以简单地将glClearColor()设置为雾色,而根本不使用天空盒,因为在所有可见的天空盒中,您都应该看到雾了,对吧? 更高级的用法可以根据vec3与水平线之间的角度将天空盒着色器修改为从雾移到天空盒纹理,因此,在仰望天空时(可以看到),但是在水平方向看只是显示雾,并具有两者之间的平稳过渡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM