opengl三维场景
时间: 2024-12-29 16:22:10 浏览: 9
### 创建和渲染OpenGL三维场景
#### 初始化环境
为了创建一个能够显示三维图形的应用程序,需要初始化GLFW库来管理窗口以及输入设备。通过调用`glfwInit()`函数启动GLFW库,并设置所需的OpenGL版本和其他属性。
```c++
if (!glfwInit()) {
std::cerr << "Failed to initialize GLFW\n";
}
// 设置OpenGL版本为3.3核心模式
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, "LearnOpenGL", NULL, NULL);
if (window == NULL){
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
}
glfwMakeContextCurrent(window); // 将新创建的窗口设为当前线程的主要上下文
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); // 加载所有OpenGL指针函数
```
#### 配置着色器
接着定义顶点着色器与片段着色器用于处理几何数据及颜色计算。这里展示了一个简单的例子,在其中设置了模型视图投影矩阵以转换坐标系中的位置向量[^1]。
```cpp
const char *vertexShaderSource = R"(
#version 330 core
layout(location = 0) in vec3 aPos;
uniform mat4 modelViewProjectionMatrix;
void main()
{
gl_Position = modelViewProjectionMatrix * vec4(aPos, 1.0f);
})";
const char *fragmentShaderSource = R"(
#version 330 core
out vec4 FragColor;
void main(){
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
})
```
#### 构建缓冲区
之后构建VAO(Vertex Array Object)、VBO(Vertex Buffer Objects),并将这些资源绑定到GPU内存上供后续绘制命令访问。这一步骤涉及到分配存储空间给顶点数组及其关联的数据结构[^2]。
```cpp
unsigned int VAO, VBO;
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);
```
#### 渲染循环
最后进入主事件循环之前先准备好变换矩阵作为参数传递给着色器程序;每帧更新一次屏幕上的图像直到关闭应用程序为止。在此期间可以响应用户的交互操作调整相机视角或其他动态效果[^3]。
```cpp
while(!glfwWindowShouldClose(window)){
processInput(window);
glm::mat4 view = camera.GetViewMatrix();
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom),
(float)SCR_WIDTH / (float)SCR_HEIGHT,
0.1f, 100.0f);
glm::mat4 model = glm::rotate(glm::mat4(), (GLfloat)glfwGetTime() * glm::radians(-50.f), glm::vec3(0.5f, 1.0f, 0.0f));
glm::mat4 mvp = projection * view * model;
shader.use();
shader.setMat4("modelViewProjectionMatrix", mvp);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 36);
}
```
阅读全文