opengl 大气散射和天空几何

h7appiyu  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(110)

我正试图在我的图形(游戏)引擎中实现一个大气散射,它基于GPU Gems的文章:这篇文章中的一个示例实现使用了skydome。我的场景是不同的-我不渲染整个地球的大气层,也可以从空间可见,但一些有限的单位(矩形)区域的对象,例如赛道。事实上,这是许多游戏中最常见的场景。现在我想知道如何在这种情况下渲染天空:
1.我应该使用哪种几何体:skydome,skybox或者全屏四-然后我必须移动几乎所有的计算片段着色器,但我不知道它是否makse意义上的质量/性能?
2.如何在场景中放置天空几何体?**我的想法:**我有一个半径为1,中心在vec 3(0,0,0)中的半球(圆顶)几何体-在对象空间中。这些顶点将发送到大气散射顶点着色器:

layout(location=0) in vec3 inPosition;

字符集
接下来,在顶点着色器中,我以这种方式变换顶点:

v3Pos = inPosition * 0.25f + 10.0f;


均匀v3 CameraPos= vec 3(0.0f,10.0f,0.0f),均匀fInnerRadius= 10.0f,均匀fCameraHeight= 10.0f
然后我有一个正确的内/外半径比例(10/10.25),对不对?我还向顶点着色器发送一个模型矩阵,它将半球的位置设置为移动的相机vec 3的位置(myCamera.x,myCamera.y,myCamera.z):

vec4 position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(inPosition, 1.0);
gl_Position = position.xyww; // always fails depth test.


半球与摄影机一起移动(仅包围半径为1的摄影机周围的一些空间,但它也总是无法通过深度测试。)
但我看到的天空颜色并不正确:screen1
3.“天空曲线”怎么样?下面是一张图片,可以证明我的意思:image1如何设置天空曲线?

**Edit 1- debugging:**在顶点着色器中,我分配给半球中“最高”顶点的v3 Pos位置:

vec3 v3Pos = vec3(0.0f, 10.25f, 0.0f);


现在整个天空包含该顶点的颜色:screen2

b5buobof

b5buobof1#

这是简化的大气散射

在内外大气中工作
1.对于真实的散射,您需要计算通过大气深度的曲线积分
所以你需要知道哪个方向的大气层有多厚。你的地形是“平坦的四边形+/-一些颠簸”,但你必须知道它在地球上的位置(x,y,z)和正常的(nx,ny,nz)。对于大气层,你可以使用球体或像我一样的椭球体,除非你想实现整个散射(通过区域积分而不是曲线)过程,那么你真正需要的只是从相机到大气层末端的光线长度。
所以你也可以用预先计算的大气边缘距离来做一个cube-map纹理,因为平面区域内的移动并不重要。
1.您还需要太阳位置
可以简化为每天绕地轴正常旋转1圈,或者也可以实现季节轨迹转换
1.现在就在渲染之前用天空填充屏幕
您可以在着色器中完成所有操作。一个奎德就够了

**在片段中:**从立方体Map或从与大气球体/椭球体的像素方向相交处获取大气厚度,然后进行积分(完整或简化)。输出颜色到屏幕像素

camsedfj

camsedfj2#

只要(a)覆盖屏幕和(B)为片段着色器提供合理的v3Direction值,使用什么几何体都无所谓。对于所有情况来说,这是一个典型的地球游戏,就像一个有赛道的游戏,天空将在所有其他物体的后面,所以准确的Z并不是一个大问题。

相关问题