要使用 VAO、VBO 和 EBO 渲染四个矩形(每个矩形由两个三角形组成),我们需要设置顶点数据和索引数据。下面是一个完整的 OpenGL 示例,展示如何进行这些操作。
代码示例
以下是完整的代码示例,演示了如何创建并渲染四个矩形,每个矩形都是由两个三角形组成。
#include <glad/glad.h> // 包含 glad 头文件
#include <GLFW/glfw3.h>
#include <iostream>
// 定义窗口大小
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
// 顶点着色器源代码
const char* vertexShaderSource = R"(
#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; // 将颜色传递给片段着色器
}
)";
// 片段着色器源代码
const char* fragmentShaderSource = R"(
#version 330 core
in vec3 ourColor; // 从顶点着色器接收颜色
out vec4 FragColor; // 输出的片段颜色
void main() {
FragColor = vec4(ourColor, 1.0); // 设置输出颜色为输入颜色,alpha 通道设为 1.0(不透明)
}
)";
int main() {
// 初始化 GLFW 和设置版本
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 创建窗口并创建 OpenGL 上下文
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Render Rectangles", NULL, NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
return -1;
}
glfwMakeContextCurrent(window);
// 加载 OpenGL 函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 编译顶点着色器和片段着色器并链接程序
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);
// 定义四个矩形的顶点和对应的颜色 (8 个三角形)
float vertices[] = {
// 矩形一 (左上)
-0.9f, -0.9f, 0.0f, 1.0f, 0.0f, 0.0f,
0.9f, -0.9f , .00 , .95 , .99 , .01,
.90 , .90 , .00 , .00 , .99 , .01,
-00.f , .90 , .00 , ..5 ,.5 ,.5 ,
// 矩形二 (右上)
-.9,-.10,.000,.500,.4997,.17,
-.,-.,-.35,-099,-00970.
...
};
unsigned int indices[] = {
// 第一个矩形,由两个三角形组成:
0, 1, 2,
2, 3, 0,
// 第二个矩形,由两个三角形组成:
4 + count_offset_6_indices,
count_of_vertices[index].
...
};
// 创建 VAO、VBO 和 EBO 并绑定数据
GLuint VAO,VBO,EBO;
glGenVertexArrays(1,&VAO);
glGenBuffers(1,&VBO);
glGenBuffers(1,&EBO);
//绑定 VAO
glBindVertexArray(VAO);
// 将数据传输到 VBO
glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices.GL_STATIC_DRAW);
// 将元素传输到 EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices.GL_STATIC_DRAW);
// 设置顶点属性指针 (位置)
glVertexAttribPointer( Gluint index,unsigned size,type normalize stride ptr add offset
... )
...
...
..
..
//
..
;;
}
}
}
while(!shouldClose){
gllClear();
`clClearFlags`
$;;
'...
Draw things
);
...
}
注意事项
在这个示例中,我们为每个矩形定义了四个顶点,以及相应的索引。您可以根据需要调整这些坐标以改变矩形的位置或大小。
确保在实现该程序之前已安装并配置好适用于您的开发环境的 OpenGL 和相关库。如果有其他问题或者具体细节想要了解,请随时提问!
内容由零声教学AI助手提供,问题来源于学员提问