OpenGL入门实战:5分钟搞定你的第一个3D三角形(附完整代码)

发布时间:2026/7/26 19:15:37

OpenGL入门实战:5分钟搞定你的第一个3D三角形(附完整代码) OpenGL入门实战5分钟搞定你的第一个3D三角形附完整代码当你第一次接触3D图形编程时OpenGL可能会让你感到既兴奋又畏惧。作为跨平台的图形API标准它就像一扇通往计算机图形学世界的大门。但别担心我们今天不讨论那些复杂的理论而是直接动手用最短的时间让你看到自己的第一个3D三角形在屏幕上旋转——这才是最有效的学习方式。1. 环境准备搭建OpenGL开发环境在开始绘制之前我们需要确保开发环境已经就绪。现代OpenGL开发通常需要三个核心组件OpenGL核心库提供基础的图形渲染功能GLFW或GLUT处理窗口创建和输入事件GLAD或GLEW管理OpenGL函数指针加载对于Windows平台推荐使用以下工具链组合# 使用vcpkg安装依赖若已安装 vcpkg install glfw3 glad或者手动配置下载GLFW预编译库https://www.glfw.org/download.html使用GLAD在线服务生成加载器https://glad.dav1d.de/配置IDE包含路径和链接库提示初学者建议使用Visual Studio Community版其C开发环境配置最为简单。2. 创建OpenGL窗口你的第一个图形上下文让我们从创建一个400x400像素的窗口开始。以下代码展示了最基本的窗口初始化流程#include glad/glad.h #include GLFW/glfw3.h int main() { // 初始化GLFW if (!glfwInit()) { return -1; } // 配置GLFW glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 创建窗口 GLFWwindow* window glfwCreateWindow(400, 400, My First Triangle, NULL, NULL); if (!window) { glfwTerminate(); return -1; } // 设置当前上下文 glfwMakeContextCurrent(window); // 初始化GLAD if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { return -1; } // 主循环 while (!glfwWindowShouldClose(window)) { // 清空颜色缓冲 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 交换缓冲 glfwSwapBuffers(window); // 处理事件 glfwPollEvents(); } glfwTerminate(); return 0; }这段代码已经可以创建一个深绿色的窗口但还看不到任何图形。接下来我们添加真正的绘制逻辑。3. 绘制3D三角形从顶点数据到屏幕渲染现代OpenGL使用着色器管线来渲染图形。我们需要完成以下步骤定义顶点数据三角形的三个顶点坐标创建着色器程序顶点着色器和片段着色器配置顶点缓冲对象(VBO)和顶点数组对象(VAO)绘制调用首先准备顶点数据在main函数前添加float vertices[] { // 位置 // 颜色 -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 左下-红 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 右下-绿 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 顶部-蓝 };然后创建着色器程序。在相同目录下创建两个文件shader.vs顶点着色器:#version 330 core layout (location 0) in vec3 aPos; layout (location 1) in vec3 aColor; out vec3 ourColor; void main() { gl_Position vec4(aPos, 1.0); ourColor aColor; }shader.fs片段着色器:#version 330 core in vec3 ourColor; out vec4 FragColor; void main() { FragColor vec4(ourColor, 1.0); }在C代码中添加着色器加载函数unsigned int compileShader(const char* source, GLenum type) { unsigned int shader glCreateShader(type); glShaderSource(shader, 1, source, NULL); glCompileShader(shader); // 错误检查省略... return shader; } unsigned int createShaderProgram(const char* vsSource, const char* fsSource) { unsigned int program glCreateProgram(); unsigned int vs compileShader(vsSource, GL_VERTEX_SHADER); unsigned int fs compileShader(fsSource, GL_FRAGMENT_SHADER); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); glDeleteShader(vs); glDeleteShader(fs); return program; }4. 完整实现让三角形动起来现在将所有部分组合起来并添加简单的旋转动画。以下是完整的实现代码#include glad/glad.h #include GLFW/glfw3.h #include iostream #include cmath const char* vertexShaderSource R( #version 330 core layout (location 0) in vec3 aPos; layout (location 1) in vec3 aColor; out vec3 ourColor; uniform float rotation; void main() { mat2 rot mat2(cos(rotation), -sin(rotation), sin(rotation), cos(rotation)); vec2 pos rot * aPos.xy; gl_Position vec4(pos, aPos.z, 1.0); ourColor aColor; } ); const char* fragmentShaderSource R( #version 330 core in vec3 ourColor; out vec4 FragColor; void main() { FragColor vec4(ourColor, 1.0); } ); int main() { // 初始化GLFW和创建窗口同前 // ... // 定义顶点数据 float vertices[] { -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }; // 创建VBO和VAO unsigned int 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, 6 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // 颜色属性 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); // 创建着色器程序 unsigned int shaderProgram createShaderProgram(vertexShaderSource, fragmentShaderSource); // 主循环 while (!glfwWindowShouldClose(window)) { // 清屏 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 激活着色器 glUseProgram(shaderProgram); // 设置旋转uniform float timeValue glfwGetTime(); float rotation timeValue; glUniform1f(glGetUniformLocation(shaderProgram, rotation), rotation); // 绘制三角形 glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); // 交换缓冲和事件 glfwSwapBuffers(window); glfwPollEvents(); } // 清理资源 glDeleteVertexArrays(1, VAO); glDeleteBuffers(1, VBO); glDeleteProgram(shaderProgram); glfwTerminate(); return 0; }运行这个程序你会看到一个红绿蓝三色的三角形在窗口中平滑旋转。这就是你的第一个OpenGL 3D程序

相关新闻