【发布时间】: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 如何解决您的问题?你走了什么路,结果如何?