[英]Passing array of floats from vertex shader to fragment shader in glsl 3.3
[英]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.