返回
OpenGL绘制与控制正方形:初学者指南
见解分享
2023-11-14 22:15:22
OpenGL是一个功能强大的图形库,可用于创建令人惊叹的2D和3D图形。本文将带你踏上OpenGL之旅,指导你绘制并控制一个简单的正方形。
绘制正方形
- 设置OpenGL环境: 在Mac上设置OpenGL环境,并创建一个OpenGL上下文。
- 创建顶点数据: 定义正方形的四个顶点的坐标。
- 创建着色器程序: 编写着色器程序来处理图形管线中的顶点和片段着色。
- 创建缓冲对象: 创建缓冲对象来存储顶点数据和着色器程序。
- 绘制正方形: 使用
glDrawArrays
函数绘制正方形。
控制移动
- 键盘和鼠标输入: 处理键盘和鼠标事件以获取用户输入。
- 更新顶点数据: 根据用户输入更新正方形顶点的坐标。
- 重绘场景: 使用
glutPostRedisplay
函数重新绘制场景。
示例代码
以下是绘制和移动正方形的示例代码:
// 设置OpenGL环境
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL正方形", NULL, NULL);
// 创建顶点数据
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
// 创建着色器程序
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
const GLchar* vertexShaderSource =
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main() {\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar* fragmentShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main() {\n"
" FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
"}\0";
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 创建缓冲对象
GLuint 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(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// 控制移动
GLfloat x = 0.0f, y = 0.0f;
bool moveRight = false, moveLeft = false, moveUp = false, moveDown = false;
// 主循环
while (!glfwWindowShouldClose(window)) {
// 处理输入
glfwPollEvents();
if (glfwGetKey(window, GLFW_KEY_RIGHT)) {
moveRight = true;
} else {
moveRight = false;
}
if (glfwGetKey(window, GLFW_KEY_LEFT)) {
moveLeft = true;
} else {
moveLeft = false;
}
if (glfwGetKey(window, GLFW_KEY_UP)) {
moveUp = true;
} else {
moveUp = false;
}
if (glfwGetKey(window, GLFW_KEY_DOWN)) {
moveDown = true;
} else {
moveDown = false;
}
// 更新顶点数据
if (moveRight) {
x += 0.01f;
}
if (moveLeft) {
x -= 0.01f;
}
if (moveUp) {
y += 0.01f;
}
if (moveDown) {
y -= 0.01f;
}
vertices[0] = x - 0.5f;
vertices[1] = y - 0.5f;
vertices[3] = x + 0.5f;
vertices[4] = y - 0.5f;
vertices[6] = x + 0.5f;
vertices[7] = y + 0.5f;
vertices[9] = x - 0.5f;
vertices[10] = y + 0.5f;
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// 重绘场景
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_QUADS, 0, 4);
glBindVertexArray(0);
glfwSwapBuffers(window);
}
总结
本文介绍了OpenGL中绘制和控制正方形的基本原理。通过设置OpenGL环境、创建顶点数据、着色器程序和缓冲对象,你可以绘制一个正方形。通过处理键盘和鼠标输入,你可以更新正方形的顶点数据并控制它的移动。使用示例代码,你可以动手实践这些概念,并创建自己的交互式OpenGL应用程序。