2014-09-10 105 views
2

所以我对OpenGL相当陌生,我一直在尝试使用GLSL,当然,我遇到了一些问题。首先,我应该注意到我目前只绘制了一个单一的三角形。其次,这里是我的(很简单)着色器:困惑于GLSL和OpenGL

// Vertex Shader 

#version 330 

in vec3 vertex_position; 

void main() 
{ 
    gl_Position = vec4(vertex_position, 1.0); 
} 

// Fragment Shader 

#version 330 

out vec4 fragColour; 

void main() { 
    fragColour = vec4(0.0, 1.0, 0.0, 1.0); 
} 

这工作的很好,画一个三角形。大。现在,我想编辑顶点着色引擎,从而取代

gl_Position = vec4(vertex_position, 1.0) 

我做

gl_Position = vec4(vertex_position, 2.0) 

果然,它放大了我的三角形。所以我想,也许如果我走在Z从我的顶点着色器和设置在W等于它,我能得到深度感,所以我这样做:

// Vertex Shader 

#version 330 

in vec3 vertex_position; 

void main() 
{ 
    gl_Position = vec4(vertex_position, vertex_position.z); 
} 

但很可惜,当我运行程序,它什么也没有显示。如果人们想知道,这里是我的顶点:

float points[] = { 
    0.0f, 0.5f, 1.0f, 
    0.5f, -0.5f, 1.0f, 
    -0.5f, -0.5f, 1.0f 
}; 

而且,我应该说,我注意到,在float points[] Z值更改为0以外的任何东西,使三角形出于某种原因不可见的部分。

回答

4

其中w坐标为0的“顶点”被认为是无限远的,所以它不会被显示。 0的w用于表示方向,而不是点。

设置w等于z删除深度任何意义。点[x, y, z, w]的实际三维坐标是[ x/w, y/w, z/w ](这是均匀坐标原理)。

通常,您将w固定为1.0,并通过x,yz设置顶点位置。

+0

好的,如果我将'float points []'的Z'编辑为1,它应该设置W = 1,但是这仍然不显示任何内容。不是'vertex_position.z'应该得到给定顶点的Z值吗?如果Z值为1,那么我的代码应该自动将W设置为1? – Nooble 2014-09-10 20:25:49

+0

@Nooble:恩,NDC中Z = 1的坐标表示您将顶点从剪辑空间中移出,因此所有的顶点都会被裁剪掉。你应该阅读如何正确转换。即建立一个模型和一个投影矩阵以及这些工作。 – datenwolf 2014-09-10 20:58:29

+0

@Angew我知道如何使用矩阵,我只是对此感到好奇。除零之外的任何_at_ _all_似乎都将其推出剪辑空间。例如,0.5,介于-1到1之间。说到-1到1,它是否包含在内? – Nooble 2014-09-10 22:40:31