2012-03-25 86 views
4

作为试图产生一个非常简单的外观天空的一部分,我创建了一个天空盒(基本上是一个从(-1,-1,-1)到(1,1,1)的立方体,这毕竟是我的几何图形绘制,被迫通过以下简单的顶点着色器的背面:简单程序skybox

#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坐标简单地混合我的两种颜色看起来会非常糟糕:事实上,您正在查看盒子而不是圆顶立即清理R,因为在这里看到:

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); 
} 

但是结果是一样一样的,第一个屏幕(如果需要的话我可以发布,但由于它是视觉上相似于第一,我跳过它缩短这个问题现在)。

一些随机摆弄后(货物崇拜编程,我知道:/),我才意识到,这个工程:

void main() 
{ 
    vec3 pointOnSphere = normalize(vtx_data.worldspace_position.xyz); 
    float a = pointOnSphere.y; 
    outputColor = mix(skyhorizon, skytop, a); 
} 

唯一的区别是,我没有正常化它的成分W的位置。

而这里的工作结果:(所不同的是在屏幕截图微妙,但在运动相当明显) correct skybox

所以,最后,我的问题:为什么这个工作的时候以前的版本失败?我必须误解一些关于同质坐标的非常基本的东西,但是我的大脑现在不会点击!

回答

3

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

我不知道vec3 pointOnSphere = normalize(vtx_data.worldspace_position);是什么意思,因为左边也应该有vec4

+0

vec3 pointOnSphere = normalize(vtx_data.worldspace_position)是我的部分拼写错误,而用代码来生成此问题的屏幕截图:o对不起!并感谢您的答案! – 2012-03-26 09:21:33