我试图在图形(游戏)引擎中实现基于gems文章:链接的大气散射。文章中的一个示例实现使用了天穹。我的场景是不同的-我不会渲染一个大气层的整个地球也可以看到从空间,但一些有限的平面(矩形)区域对象,例如一个跑道。事实上,这是许多游戏中最常见的场景。现在我想知道在这种情况下如何渲染天空:
1.我应该使用什么样的几何学:天穹,天幕盒还是全屏四边形--然后我必须将几乎所有的计算都移到片段着色器上,但我不知道它在质量/性能方面是否有意义?
2.如何在场景中放置天空几何?我的想法是:在物体空间中有一个半径为1,中心为vec3(0,0,0)的半球(天穹)几何。这些顶点被发送到大气散射顶点着色器:
layout(location=0) in vec3 inPosition;接下来,在顶点着色器中,我以这种方式转换顶点:
v3Pos = inPosition * 0.25f + 10.0f;均匀fCameraHeight v3CameraPos = vec3(0.0f,10.0f,0.0f),统一fInnerRadius = 10.0f,均匀fInnerRadius= 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,我应该如何设置一个天空曲线?
Edit1 -调试:指定给半球“最高”顶点的v3Pos位置的顶点着色器I中的:
vec3 v3Pos = vec3(0.0f, 10.25f, 0.0f);现在整个天空都有一个顶点的颜色:screen2
发布于 2014-03-07 08:19:51
这是我的简化大气散射
在外部和内部气氛中工作
(x,y,z)和普通(nx,ny,nz)。对于大气,你可以使用球体或像我这样的椭球,除非你想实现整个散射(通过面积积分,而不是曲线)过程,那么你真正需要的只是从相机到大气层末端的光线长度。
因此,你也可以做一个预先计算的大气边缘距离的cube-map纹理,因为在你的平面区域内的运动并不重要。发布于 2013-11-30 04:34:39
只要(a)覆盖屏幕和(b)为v3Direction提供一个合理的值,使用什么样的几何图形并不重要。因为所有的情况都是一个典型的地球上的游戏,就像一个有赛道的游戏,天空将在所有其他物体的后面,所以精确的Z不是什么大事。
https://stackoverflow.com/questions/20273085
复制相似问题