作为生成外观非常简单的天空的一部分,我创建了一个天空盒(基本上是一个从(-1,-1,-1)到(1,1,1)的立方体)。在所有几何体之后绘制,并通过以下简单的顶点着色器强制移到背面。
从这里开始,我试图让我的天空显示为一个非常简单的渐变色,从顶部的深蓝色到地平线处的浅蓝色。
显然,只是根据每个片段的Y坐标混合两种颜色会看起来非常糟糕:你正在看一个盒子而不是一个圆顶,如下所示:
请注意,在盒子的左上角和右上角有相当明显的“角”。
本能地,我认为解决问题的明显方法将是规范化每个片段的位置,得到一个单位球上的位置,然后取其Y坐标。我认为这将导致一个对于给定“高度”来说是恒定的值,如果有意义的话。就像这样:
然而,结果与第一张截图基本相同(如果需要,我可以发帖),但由于视觉上类似于第一张图,我现在跳过了它以缩短这个问题。
唯一的区别是我将位置规范化,但不包括它的W分量。
以下是工作结果:(在静态截图中差异微小,但在运动中相当明显) 最后,我的问题是:为什么这个版本可以工作,而之前的版本无法工作?我可能对齐次坐标的某些极其基本的概念存在误解,但我的大脑现在无法理解!
#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 normal;
out Data
{
vec4 eyespace_position;
vec4 eyespace_normal;
vec4 worldspace_position;
vec4 raw_position;
} vtx_data;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
mat4 view_without_translation = view;
view_without_translation[3][0] = 0.0f;
view_without_translation[3][1] = 0.0f;
view_without_translation[3][2] = 0.0f;
vtx_data.raw_position = position;
vtx_data.worldspace_position = model * position;
vtx_data.eyespace_position = view_without_translation * vtx_data.worldspace_position;
gl_Position = (projection * vtx_data.eyespace_position).xyww;
}
从这里开始,我试图让我的天空显示为一个非常简单的渐变色,从顶部的深蓝色到地平线处的浅蓝色。
显然,只是根据每个片段的Y坐标混合两种颜色会看起来非常糟糕:你正在看一个盒子而不是一个圆顶,如下所示:
请注意,在盒子的左上角和右上角有相当明显的“角”。
本能地,我认为解决问题的明显方法将是规范化每个片段的位置,得到一个单位球上的位置,然后取其Y坐标。我认为这将导致一个对于给定“高度”来说是恒定的值,如果有意义的话。就像这样:
#version 330
in Data
{
vec4 eyespace_position;
vec4 eyespace_normal;
vec4 worldspace_position;
vec4 raw_position;
} vtx_data;
out vec4 outputColor;
const vec4 skytop = vec4(0.0f, 0.0f, 1.0f, 1.0f);
const vec4 skyhorizon = vec4(0.3294f, 0.92157f, 1.0f, 1.0f);
void main()
{
vec4 pointOnSphere = normalize(vtx_data.worldspace_position);
float a = pointOnSphere.y;
outputColor = mix(skyhorizon, skytop, a);
}
然而,结果与第一张截图基本相同(如果需要,我可以发帖),但由于视觉上类似于第一张图,我现在跳过了它以缩短这个问题。
经过一些随意的尝试(我知道这是土著编程:/),我意识到这样可以运行:
void main()
{
vec3 pointOnSphere = normalize(vtx_data.worldspace_position.xyz);
float a = pointOnSphere.y;
outputColor = mix(skyhorizon, skytop, a);
}
唯一的区别是我将位置规范化,但不包括它的W分量。
以下是工作结果:(在静态截图中差异微小,但在运动中相当明显) 最后,我的问题是:为什么这个版本可以工作,而之前的版本无法工作?我可能对齐次坐标的某些极其基本的概念存在误解,但我的大脑现在无法理解!