对GLSL和OpenGL感到困惑

Confused about GLSL and OpenGL

本文关键字:OpenGL GLSL      更新时间:2023-10-16

所以我对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);
}

这样画一个三角形效果很好。太棒了现在我想编辑顶点着色器,这样就可以代替

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以外的任何值都会使三角形的该部分不可见。

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

w设置为等于z消除任何深度感。点[x, y, z, w]的实际三维坐标是[ x/w, y/w, z/w ](这是齐次坐标的原理)。

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