返回

点亮OpenGL世界:绘制三角形

前端

OpenGL教程(三):绘制你的第一个三角形

在之前的教程中,我们了解了如何创建一个基本的OpenGL窗口。现在,我们将迈出激动人心的一步:绘制我们的第一个三角形!在3D图形的世界中,三角形是构建所有其他形状的基石。

为OpenGL做好准备

在绘制三角形之前,我们需要为OpenGL做好准备。首先,我们要创建一个顶点着色器和一个片段着色器,这些着色器负责将我们的三角形从3D空间转化为屏幕上的像素。

顶点着色器

#version 330 core

layout (location = 0) in vec3 aPos;

void main() {
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

这个顶点着色器简单地将顶点的位置传递给OpenGL的内置变量gl_Position,它决定了顶点在屏幕上的位置。

片段着色器

#version 330 core

out vec4 FragColor;

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

这个片段着色器为每个片段(像素)设置了颜色。在这种情况下,我们绘制的是一个红色的三角形。

编译和链接着色器

接下来,我们需要编译和链接着色器程序:

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);

GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

构建三角形

现在我们有了着色器程序,我们可以开始构建我们的三角形。我们将使用OpenGL的glBufferglVertexAttribPointer函数来定义三角形的顶点:

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

GLuint VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

这段代码创建了顶点数组对象(VAO)和顶点缓冲对象(VBO),并将顶点数据绑定到VBO。最后,它使用glVertexAttribPointer函数将VBO中的数据关联到着色器程序中的顶点属性。

渲染三角形

最后,我们需要渲染三角形:

glUseProgram(shaderProgram);
glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, 3);

这个调用激活了我们的着色器程序,绑定了VAO,并使用glDrawArrays函数绘制三角形。

总结

恭喜!你现在已经成功地绘制了你的第一个OpenGL三角形。这是进入3D图形世界的一个重要一步。随着你不断探索OpenGL,你的图形学技能将突飞猛进。