首先搭建开发环境并初始化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 <glad/glad.h>
#include <GLFW/glfw3.h>
<p>int main() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);</p><pre class="brush:php;toolbar:false;">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;
<p>void main() {
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
片段着色器(fragment.glsl):
#version 330 core
out vec4 FragColor;
<p>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); <p>unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader);</p><p>unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram);</p><p>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
};
<p>unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);</p><p>glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);</p><p>glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 <em> sizeof(float), (void</em>)0);
glEnableVertexAttribArray(0);</p><p>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);
<pre class="brush:php;toolbar:false;">glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();}
调用glDrawArrays即可将顶点数据渲染成三角形。
6. 扩展到3D图形
要渲染真正的3D图形,你需要引入:
- 模型、视图、投影(MVP)矩阵:使用GLM库进行数学计算。
- 顶点属性扩展:加入法线、纹理坐标等。
- 索引绘制(EBO):减少重复顶点。
例如,使用GLM构建MVP:
#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> <p>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初始化顺序或着色器编译检查。建议从画一个三角形开始,逐步增加功能。










