GLSL 中基于范围的雾
Range Based Fog in GLSL
我发现很多帖子都说可以使用 gl_Position.z 或 gl_FragCoord.z/gl_FragCoord.w 轻松获得雾片段距离。
问题是这在雾开始的地方形成了边界。
我想做的是根据玩家的位置确定这个距离,这样玩家周围就有一个雾半径。
为简单起见,假设我希望根据像素与世界 space 中 (0, 0, 0) 的距离对雾进行插值。此坐标只有 fog_end 范围内的像素可见。
您可以在边界处插入雾。
//distance of fragment in worldspace
float distance = ...;
float fog_start = 10;
float fog_end = 20;
//linear interpolation
float fog_factor = (distance-fog_start)/(fog_end-fog_start);
fog_factor = clamp(fog_factor,0,1);
//add 'white fog' to color
out_color += vec4(fog_factor);
世界空间距离可以通过将视空间中的顶点传递给片段着色器并计算长度来获得。
经过更多搜索,我发现我所指的是基于范围的雾,而不是基于平面的雾。
我还遇到了一个问题,即必须使用很少的顶点才能使其正常工作。因此,距离计算需要在片段着色器中进行。
可以在此处找到一些有用的详细信息。
http://web.archive.org/web/20160615092925/http://in2gpu.com/2014/07/22/create-fog-shader/
我发现很多帖子都说可以使用 gl_Position.z 或 gl_FragCoord.z/gl_FragCoord.w 轻松获得雾片段距离。
问题是这在雾开始的地方形成了边界。
我想做的是根据玩家的位置确定这个距离,这样玩家周围就有一个雾半径。
为简单起见,假设我希望根据像素与世界 space 中 (0, 0, 0) 的距离对雾进行插值。此坐标只有 fog_end 范围内的像素可见。
您可以在边界处插入雾。
//distance of fragment in worldspace
float distance = ...;
float fog_start = 10;
float fog_end = 20;
//linear interpolation
float fog_factor = (distance-fog_start)/(fog_end-fog_start);
fog_factor = clamp(fog_factor,0,1);
//add 'white fog' to color
out_color += vec4(fog_factor);
世界空间距离可以通过将视空间中的顶点传递给片段着色器并计算长度来获得。
经过更多搜索,我发现我所指的是基于范围的雾,而不是基于平面的雾。
我还遇到了一个问题,即必须使用很少的顶点才能使其正常工作。因此,距离计算需要在片段着色器中进行。
可以在此处找到一些有用的详细信息。
http://web.archive.org/web/20160615092925/http://in2gpu.com/2014/07/22/create-fog-shader/