gpt4 book ai didi

opengl - 简单的程序天空盒

转载 作者:行者123 更新时间:2023-12-04 20:51:48 27 4
gpt4 key购买 nike

作为尝试生成非常简单的天空的一部分,我创建了一个天空盒(基本上是一个从 (-1, -1, -1) 到 (1, 1, 1) 的立方体,它是在所有我的几何体并通过以下简单的顶点着色器被迫向后:

#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 坐标混合我的两种颜色会看起来非常糟糕:您正在看一个盒子而不是一个圆顶的事实很明显,如下所示:

wrong skybox

请注意盒子左上角和右上角的相当明显的“角”。

本能地,我认为显而易见的解决方法是标准化每个片段的位置,在单位球体上获得一个位置,然后取其 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);
}

然而,结果与第一个屏幕截图大致相同(如果需要,我可以发布它,但由于它在视觉上与第一个相似,我现在跳过它以缩短这个问题)。

经过一些随机摆弄( cargo 崇拜编程,我知道:/),我意识到这是有效的:
void main()
{
vec3 pointOnSphere = normalize(vtx_data.worldspace_position.xyz);
float a = pointOnSphere.y;
outputColor = mix(skyhorizon, skytop, a);
}

唯一的区别是我在没有 W 分量的情况下对位置进行了标准化。

这是工作结果:(屏幕截图中的差异很小,但在运动中非常明显)
correct skybox

所以,最后,我的问题是:当以前的版本失败时,为什么这会起作用?我一定误解了关于齐次坐标的一些非常基本的东西,但我的大脑现在没有点击!

最佳答案

GLSL normalize本身不处理齐次坐标。它将坐标解释为属于 R^4 .这通常不是您想要的。但是,如果 vtx_data.worldspace_position.w == 0 ,那么归一化应该产生相同的结果。

不知道是什么vec3 pointOnSphere = normalize(vtx_data.worldspace_position);意味着因为左侧应该有类型 vec4还。

关于opengl - 简单的程序天空盒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9864491/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com