首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大气散射与天空几何

大气散射与天空几何
EN

Stack Overflow用户
提问于 2013-11-28 18:52:22
回答 2查看 5.1K关注 0票数 0

我试图在图形(游戏)引擎中实现基于gems文章:链接的大气散射。文章中的一个示例实现使用了天穹。我的场景是不同的-我不会渲染一个大气层的整个地球也可以看到从空间,但一些有限的平面(矩形)区域对象,例如一个跑道。事实上,这是许多游戏中最常见的场景。现在我想知道在这种情况下如何渲染天空:

1.我应该使用什么样的几何学:天穹,天幕盒还是全屏四边形--然后我必须将几乎所有的计算都移到片段着色器上,但我不知道它在质量/性能方面是否有意义?

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

代码语言:javascript
复制
layout(location=0) in vec3 inPosition;

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

代码语言:javascript
复制
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):

代码语言:javascript
复制
vec4 position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(inPosition, 1.0);
gl_Position = position.xyww; // always fails depth test.

半球与摄像机一起运动(半径= 1的摄像机周围只包含一些空间,但它也总是无法通过深度测试)。

不幸的是,我得到的天空颜色是不正确的:screen1

3.“天空曲线”如何?这里有一张图片,展示了我的意思:image1,我应该如何设置一个天空曲线?

Edit1 -调试:指定给半球“最高”顶点的v3Pos位置的顶点着色器I中的

代码语言:javascript
复制
vec3 v3Pos = vec3(0.0f, 10.25f, 0.0f);

现在整个天空都有一个顶点的颜色:screen2

EN

回答 2

Stack Overflow用户

发布于 2014-03-07 08:19:51

这是我的简化大气散射

在外部和内部气氛中工作

  1. 用于真实感散射,需要通过大气深度计算曲线积分 所以你需要知道大气在哪个方向有多厚。你的地形是“平四+/-一些颠簸”,但你必须知道它在地球上的位置(x,y,z)和普通(nx,ny,nz)。对于大气,你可以使用球体或像我这样的椭球,除非你想实现整个散射(通过面积积分,而不是曲线)过程,那么你真正需要的只是从相机到大气层末端的光线长度。 因此,你也可以做一个预先计算的大气边缘距离的cube-map纹理,因为在你的平面区域内的运动并不重要。
  2. 您还需要太阳位置 可以简化为每天绕地轴1圈旋转,也可以实现季节轨迹偏移。
  3. 现在就在用天空渲染满屏之前 你可以在着色器里做所有的事情。一个四重奏就够了。 在片段:获取大气厚度,形成立方体地图或从像素方向与大气球/椭球交点,然后进行积分(完全或简化)。输出颜色到屏幕像素
票数 1
EN

Stack Overflow用户

发布于 2013-11-30 04:34:39

只要(a)覆盖屏幕和(b)为v3Direction提供一个合理的值,使用什么样的几何图形并不重要。因为所有的情况都是一个典型的地球上的游戏,就像一个有赛道的游戏,天空将在所有其他物体的后面,所以精确的Z不是什么大事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20273085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档