大气散射和天空几何

时间:2013-11-28 18:52:22

标签: opengl 3d glsl shader

我试图在我的图形(游戏)引擎中根据gpu gems文章link实现大气散射。该文章的一个示例实现使用了一个天幕。我的场景不同 - 我不会渲染 整个地球的气氛,从空间也可以看到,但一些有限的平面(矩形) 带有物体的区域,例如赛道。事实上,这是许多游戏中最常见的场景。现在 我想知道如何在这种情况下渲染天空:

1.我应该使用什么样的几何体:天幕,天空盒或全屏四边形 - 然后我必须这样做 将几乎所有计算都移到片段着色器中,但我不知道它是否具有术语感 质量/性能?

2.如何在场景中放置天空几何图形? 我的想法: 我有一个半球(skydome)几何体,半径= 1,中心在vec3(0,0,0) - 在物体空间。 那些顶点被发送到大气散射顶点着色器:

layout(location=0) in vec3 inPosition;

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

v3Pos = inPosition * 0.25f + 10.0f;

制服 v3CameraPos = vec3(0.0f,10.0f,0.0f),均匀 fInnerRadius = 10.0f,均匀 fCameraHeight = 10.0f

然后我纠正了内/外半径比(10 / 10.25),对吗?我还向顶点着色器发送了一个设置位置的模型矩阵 半球到移动摄像头vec3的位置(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 我该如何设置天空曲线?

编辑1 - 调试:在顶点着色器中,我指定了"最高"的v3Pos位置。半球顶点:

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

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

2 个答案:

答案 0 :(得分:1)

这是我的简化大气散射

在室外和室内氛围中工作

  1. 对于真实散射您需要通过大气深度计算曲线积分

    所以你需要知道大气在哪个方向上有多厚。您的地形是“平坦的QUAD +/-一些颠簸”,但您必须知道它在地球上的位置(x,y,z)和正常(nx,ny,nz)。对于大气,你可以使用球体或类似椭圆体,除非你想要实现整个散射(通过面积而不是曲线整合)过程,那么你真正需要的只是从相机到大气结束的光线长度。

    因此您也可以使用预先计算的大气边缘距离进行cube-map纹理,因为平坦区域内的移动并不重要。

  2. 您还需要太阳位置

    可以简化为每天绕地球轴旋转1次,或者你也可以实现季节轨迹移动

  3. 现在就在用天空渲染填充屏幕之前

    你可以在着色器中完成所有操作。一个Quad足够了。

    片段中的

    从立方体贴图或从大气球/椭圆体的像素方向交点获取大气厚度,然后进行积分(完整或简化)。将颜色输出到屏幕像素

答案 1 :(得分:0)

只要(a)它覆盖scren并且(b)为片段着色器提供v3Direction的合理值,使用几何形状并不重要。对于所有情况来说,典型的实地游戏就像一个有赛道的游戏,天空将落后于所有其他物体,因此准确的Z并不是一件大事。