首先搭建开发环境并初始化GLFW和GLAD,接着创建窗口和OpenGL上下文,然后编写并编译顶点与片段着色器,定义三角形顶点数据并通过VBO和VAO上传至GPU,设置MVP矩阵实现3D变换,最后在渲染循环中调用glDrawArrays绘制图形。

要在C++中使用现代OpenGL API进行3D图形渲染,你需要搭建一个合适的开发环境,并理解现代OpenGL的核心概念,比如着色器、顶点缓冲对象(VBO)、顶点数组对象(VAO)和元素缓冲对象(EBO)。下面是一个清晰的入门指南。
1. 搭建开发环境
现代OpenGL不包含在标准库中,需要借助第三方库来创建窗口和管理上下文。常用组合如下:
- GLFW:用于创建窗口、处理输入和管理OpenGL上下文。
- GLAD:用于加载OpenGL函数指针(你也可以选择GLEW,但GLAD更推荐用于现代OpenGL)。
安装方式(以Windows + Visual Studio为例):
- 使用vcpkg或手动下载编译GLFW和GLAD。- 在项目中包含头文件并链接库文件。
2. 初始化OpenGL上下文
使用GLFW创建窗口并初始化GLAD:
立即学习“C++免费学习笔记(深入)”;
#include#include int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL 3D", nullptr, nullptr); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { return -1; } glViewport(0, 0, 800, 600);3. 编写着色器程序
现代OpenGL要求你编写顶点着色器和片段着色器。这里是一个简单的着色器示例:
顶点着色器(vertex.glsl):#version 330 core layout (location = 0) in vec3 aPos;void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); }
片段着色器(fragment.glsl):
#version 330 core out vec4 FragColor;void main() { FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); // 橙色 }
在C++中读取并编译着色器:
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader);unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader);
unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram);
glDeleteShader(vertexShader); glDeleteShader(fragmentShader);
4. 定义顶点数据并上传到GPU
定义一个简单的三角形顶点数据:
float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f };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, 3 sizeof(float), (void)0); glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0);
5. 渲染循环中绘制图形
在主循环中调用OpenGL绘制命令:
while (!glfwWindowShouldClose(window)) { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); glfwPollEvents();}
调用
glDrawArrays即可将顶点数据渲染成三角形。6. 扩展到3D图形
要渲染真正的3D图形,你需要引入:
- 模型、视图、投影(MVP)矩阵:使用GLM库进行数学计算。
- 顶点属性扩展:加入法线、纹理坐标等。
- 索引绘制(EBO):减少重复顶点。
例如,使用GLM构建MVP:
#include#include glm::mat4 model = glm::rotate(glm::mat4(1.0f), glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f)); glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -3.0f)); glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f/600.0f, 0.1f, 100.0f);
然后将这些矩阵传递给着色器中的uniform变量。
基本上就这些。掌握VBO、VAO、着色器和MVP矩阵后,你就可以开始构建复杂的3D场景了。不复杂但容易忽略细节,比如GLAD初始化顺序或着色器编译检查。建议从画一个三角形开始,逐步增加功能。










