返回

OpenGL绘制与控制正方形:初学者指南

见解分享

OpenGL是一个功能强大的图形库,可用于创建令人惊叹的2D和3D图形。本文将带你踏上OpenGL之旅,指导你绘制并控制一个简单的正方形。

绘制正方形

  1. 设置OpenGL环境: 在Mac上设置OpenGL环境,并创建一个OpenGL上下文。
  2. 创建顶点数据: 定义正方形的四个顶点的坐标。
  3. 创建着色器程序: 编写着色器程序来处理图形管线中的顶点和片段着色。
  4. 创建缓冲对象: 创建缓冲对象来存储顶点数据和着色器程序。
  5. 绘制正方形: 使用glDrawArrays函数绘制正方形。

控制移动

  1. 键盘和鼠标输入: 处理键盘和鼠标事件以获取用户输入。
  2. 更新顶点数据: 根据用户输入更新正方形顶点的坐标。
  3. 重绘场景: 使用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应用程序。