【发布时间】:2022-05-07 02:14:18
【问题描述】:
我正在尝试为我的地形渲染引擎实现一个地面雾着色器。 该技术在本文中有所描述:http://www.iquilezles.org/www/articles/fog/fog.htm
这个想法是考虑从相机到片段的光线,并沿着这条光线整合雾密度函数。
这是我的着色器代码:
#version 330 core
in vec2 UV;
in vec3 posw;
out vec3 color;
uniform sampler2D tex;
uniform vec3 ambientLightColor;
uniform vec3 camPos;
const vec3 FogBaseColor = vec3(1., 1., 1.);
void main()
{
vec3 light = ambientLightColor;
vec TexBaseColor = texture(tex,UV).rgb;
//***************************FOG********************************************
vec3 camFrag = posw - camPos;
float distance = length(camFrag);
float a = 0.02;
float b = 0.01;
float fogAmount = a * exp(-camPos.z*b) * ( 1.0-exp( -distance*camFrag.z*b ) ) / (b*camFrag.z);
color = mix( light*TexBaseColor, light*FogBaseColor, fogAmount );
}
首先我不明白如何选择a和b以及它们在雾密度函数中的物理作用。
那么,结果不是我所期望的…… 我有一个地面雾,但从 0 到 1 的雾量的过渡始终以相机高度为中心。我尝试了很多不同的 a 和 b,但是当我在相机高度没有过渡时,我要么完全雾化,要么在所有地形上都没有雾化。
我检查了我使用的数据,一切都正确:
- camPos.z 是我相机的高度
- camFrag.z 是从相机到片段的向量的垂直分量
我无法理解方程式的哪一部分导致了这种情况。
对此有什么想法吗?
【问题讨论】: