> 文章列表 > OpenGL入门教程之 三角形练习

OpenGL入门教程之 三角形练习

大家好呀,今天咱们来聊聊 OpenGL 入门教程里的三角形练习!首先,绘制两个相连的三角形听起来简单,但其实背后涉及不少OpenGL的知识。比如说,glDrawArrays这个函数,它就像一个指挥官,告诉显卡怎么把顶点数据变成三角形。你只需要给它三个参数:图元类型、起始索引和顶点数,它就能搞定一切。

那问题来了,为什么顶点坐标要在[-1,1]之间呢?这就像舞台上的演员,必须站在特定的区域内才能被观众看到一样。如果跑太远,就会被“舞台”截断,观众就看不见你了。所以,别让顶点跑得太远哦!

再来,VAO和VBO就像是 OpenGL 的快递员,VAO负责组织包裹,VBO负责运输。即使你绘制了两个三角形,VAO和VBO也不需要改变,因为它们只是负责数据的传递,不管数据怎么变。

最后,用两个着色器程序分别绘制绿色和黄色的三角形,这就像给演员换衣服。顶点着色器和片段着色器就像是导演,决定舞台上每个演员的穿着和造型。这样,你就可以看到两个不同颜色的三角形啦!

所以,下次当你想要绘制复杂的图形时,记得调用glDrawArrays,别忘了给顶点数据安排好位置,让VAO和VBO来做他们的工作,然后用着色器给它们“穿衣服”,这样就能看到漂亮的图形啦!

OpenGL入门教程之 三角形练习

OpenGL入门教程

 本文章被包含在OpenGL学习专栏中。
 本练习基于OpenGL绘制三角形中绘制三角形的代码程序。

练习题目

 1.绘制两个彼此相连的三角形。
 2.创建相同的两个三角形,对它们的数据使用不同的VAO和VBO。
 3.创建两个着色器程序。使用两个着色器程序分别绘制出一个绿色三角形和黄色三角形。

题目一

解题思路

 要绘制两个三角形,我们只需要给顶点数据添加三个顶点,然后在渲染循环中使用"glDrawArrays(GL_TRIANGLES, 0, 6)"函数,即可绘制两个三角形。
glDrawArrays函数中第一个参数表示打算绘制的OpenGL图元类型,第二个参数指定顶点数组的起始索引,第三个参数指定我们打算绘制多少个顶点。
 对于VBO而言它依旧会将顶点数据复制到显存中,对于VAO而言顶点数据的读取方式依旧是三个GLfloat类型为一个顶点属性,因此VAO和VBO不需要进行调整
还要注意的是顶点数据位置坐标需要在[-1,1]内,否则会无法显示

解题代码

#include <iostream>// GLEW
#define GLEW_STATIC
#include <GL/glew.h>// GLFW
#include <GLFW/glfw3.h>// 定义窗口大小
const GLuint WIDTH = 800, HEIGHT = 600;// 定义字符串:着色器源代码(这种形式会自动拼接,分行只是好看)
const GLchar* vertexShaderSource = "#version 330 core\\n"
"layout (location = 0) in vec3 position;\\n"
"void main()\\n"
"{\\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\\n"
"}\\0";
const GLchar* fragmentShaderSource = "#version 330 core\\n"
"out vec4 color;\\n"
"void main()\\n"
"{\\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\\n"
"}\\n\\0";int main()
{// GLFW的初始化glfwInit();// GLFW的配置glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);// 创建glfw窗口并设置窗口的状态为当前线程的主状态GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);glfwMakeContextCurrent(window);// 设置glew更加现代化glewExperimental = GL_TRUE;// 初始化glewglewInit();// 定义视口左下角在窗口的位置 和 视口的大小 glViewport(0, 0, 800, 600);// 顶点着色器的创建、绑定源代码、编译GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// 检查顶点着色器编译是否成功GLint success;GLchar infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){// 着色器源代码编译失败则获取原因并打印 glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\\n" << infoLog << std::endl