已解决
为什么 glBegin 未被定义 未定义的标识符,使用新的 API(LearnOpenGL P2)
来自网友在路上 155855提问 提问时间:2023-10-22 18:48:23阅读次数: 55
最佳答案 问答题库558位专家为你答疑解惑
文章目录
- 弃用的 glBegin & glEnd
- 使用新 API 的示例
弃用的 glBegin & glEnd
环境:glfw 3.3.8 + glad core
OpenGL 初学者在尝试使用 glBegin 和 glEnd 函数来绘制三角形时,有可能找到使用这些函数的文章、代码文献
但许多这些函数已经在OpenGL的核心规范中被弃用
应该使用新的 API 来绘制图形
- 顶点缓冲对象:Vertex Buffer Objects,VBOs
- 顶点数组对象:Vertex Array Objects,VAOs
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); // 设置颜色为红色
glVertex2f(-0.6f, -0.4f); // 顶点1
glColor3f(0.0f, 1.0f, 0.0f); // 设置颜色为绿色
glVertex2f(0.6f, -0.4f); // 顶点2
glColor3f(0.0f, 0.0f, 1.0f); // 设置颜色为蓝色
glVertex2f(0.0f, 0.6f); // 顶点3
glEnd();
使用新 API 的示例
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// 窗口大小
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;// 顶点着色器源码
const char* vertexShaderSource = R"(#version 330 corelayout (location = 0) in vec3 aPos;uniform float rotation;mat3 getRotationMatrix(float angle) {float s = sin(angle);float c = cos(angle);return mat3(c, -s, 0.0,s, c, 0.0,0.0, 0.0, 1.0);}void main(){mat3 rotationMatrix = getRotationMatrix(rotation);gl_Position = vec4(rotationMatrix * aPos, 1.0);}
)";// 片段着色器源码
const char* fragmentShaderSource = R"(#version 330 coreout vec4 FragColor;uniform float time; void main(){float red = sin(time);float green = cos(time);float blue = 0.5 + 0.5 * sin(2.0 * time);FragColor = vec4(red, green, blue, 1.0);}
)";int main() {// 初始化GLFWif (!glfwInit()) {std::cout << "GLFW initialization failed" << std::endl;return -1;}// 配置GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建窗口对象GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Triangle", nullptr, nullptr);if (window == nullptr) {std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 将窗口的上下文设置为当前线程的主上下文glfwMakeContextCurrent(window);// 初始化GLADif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 创建顶点着色器对象unsigned int vertexShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);glCompileShader(vertexShader);// 检查顶点着色器是否编译成功int success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);std::cout << "Failed to compile vertex shader:\n" << infoLog << std::endl;return -1;}// 创建片段着色器对象unsigned int fragmentShader;fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);glCompileShader(fragmentShader);// 检查片段着色器是否编译成功glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);std::cout << "Failed to compile fragment shader:\n" << infoLog << std::endl;return -1;}// 创建着色器程序对象unsigned int shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 检查着色器程序是否链接成功glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);std::cout << "Failed to link shader program:\n" << infoLog << std::endl;return -1;}// 删除着色器对象glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 设置顶点数据float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f,0.0f, 0.0f, 0.0f // 原点坐标};// 创建顶点缓冲对象(VBO)和顶点数组对象(VAO)unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// 绑定VAO和VBOglBindVertexArray(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);// 解绑VAO和VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);// 渲染循环while (!glfwWindowShouldClose(window)) {// 处理输入事件glfwPollEvents();// 清空颜色缓冲glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 使用着色器程序glUseProgram(shaderProgram);// 获取当前时间float time = glfwGetTime();float rotation = time;int rotationLocation = glGetUniformLocation(shaderProgram, "rotation");glUniform1f(rotationLocation, rotation);int timeLoadtion = glGetUniformLocation(shaderProgram, "time");glUniform1f(timeLoadtion, time);// 绑定VAOglBindVertexArray(VAO);glDrawArrays(GL_POINTS, 3, 1); // 从索引3开始绘制一个点// 绘制三角形glDrawArrays(GL_TRIANGLES, 0, 3);// 解绑VAOglBindVertexArray(0);// 交换缓冲区glfwSwapBuffers(window);}// 删除VAO和VBOglDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);// 终止GLFWglfwTerminate();return 0;
}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"为什么 glBegin 未被定义 未定义的标识符,使用新的 API(LearnOpenGL P2)":http://eshow365.cn/6-21840-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!