对GLSL和OpenGL感到困惑

时间:2014-09-10 19:59:51

标签: c++ opengl glsl

所以我对OpenGL相当新,我一直在试验GLSL,当然,我遇到了一些问题。首先,我应该注意到我目前只绘制一个奇异的三角形。其次,这是我的(非常简单的)着色器:

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

这足以绘制三角形。大。现在我想到编辑Vertex Shader而不是

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以外的任何值都会使得三角形中的那部分由于某种原因而不可见。

1 个答案:

答案 0 :(得分:4)

A"顶点"其w坐标为0被认为是无限远,因此无法显示。 w为0用于表示方向,而不是点。

设置w等于z删除任何深度感。点[x, y, z, w]的实际3D坐标为[ x/w, y/w, z/w ](这是同质坐标的原理)。

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