我试图在OpenGL 3.3中为我的场景添加雾效果。我试过跟this tutorial。但是,我似乎无法在屏幕上获得相同的效果。所有这一切似乎都发生在我的物体变暗,但屏幕上没有灰雾。可能是什么问题呢?
这是我的结果。
什么时候看起来像:
这是我的片段着色器,有多个光源。没有任何雾,它工作正常。所有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));
答案 0 :(得分:2)
两件事。
首先,您应该验证您的fogParams.vFogColor
值是否设置正确。最简单的方法是将着色器短路并将color
设置为fogParams.vFogColor
并立即返回。如果场景为黑色,则表示您的雾色未正确发送到着色器。
其次,你需要消除你的天空盒。你可以简单地用雾颜色设置glClearColor(),而不是使用天空盒,因为天空盒应该是可见的,你应该看到雾,对吗?更高级的用法可以修改天空盒着色器从雾到天空盒纹理,具体取决于vec3离水平方向的角度,所以当仰视天空(有些)可见时,但水平看起来只是显示雾,并有一个两者之间平稳过渡。