【问题标题】:atmospheric scattering and sky geometry大气散射和天空几何
【发布时间】:2013-12-14 21:39:01
【问题描述】:

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

1.我应该使用什么样的几何图形:skydome、skybox 或全屏四边形 - 然后我必须 将几乎所有计算移至片段着色器,但我不知道它是否有意义 质量/性能?

2.如何在场景中放置天空几何? 我的想法: 我有一个半球(天穹)几何,半径 = 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 我应该如何设置天空曲线?

Edit1 - 调试:在我分配给半球“最高”顶点的 v3Pos 位置的顶点着色器中:

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

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

【问题讨论】:

  • 这与您的实际问题无关,但它确实立即引起了我的注意。您应该考虑将inPosition 声明为vec4。 GLSL 将使用 (0.0, 0.0, 0.0, 1.0) 自动扩展任何 vertex attribute 用于缺少的组件。因此,如果您声明它vec4 并且只给它足够的数据来填充vec3 当您使用glVertexAttribPointer (...) 时,GLSL 将自动为inPosition.w 分配一个 1.0 的值,然后你不必须在顶点着色器中处理vec4 (inPosition, 1.0) 之类的东西。 顺便说一下,这只适用于顶点属性。
  • @Irbis 如何解决您的问题?你走了什么路,结果如何?

标签: opengl 3d glsl shader


【解决方案1】:

这是我简化的大气散射

在外部和内部环境中工作

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

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

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

  2. 你还需要太阳位置

    可以简化为每天绕地球轴正常旋转 1 圈,或者您也可以实现季节轨迹偏移

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

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

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

【讨论】:

    【解决方案2】:

    只要(a)它覆盖屏幕并且(b)您为片段着色器提供一个合理的 v3Direction 值,您使用什么几何图形实际上并不重要。在所有情况下都是典型的地球游戏,比如赛道,天空会在所有其他物体的后面,所以准确的 Z 并不是什么大问题。

    【讨论】:

    • 一般规则是显而易见的,但您必须以某种方式计算适当的样本点。您甚至可以将几乎所有计算推送到片段,但在质量/性能方面可能过于昂贵。这是为什么我的实现不起作用的答案:gamedev.net/topic/…大气散射算法和天空几何之间存在某种关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多