求助:OpenGL C++代码无法渲染三角形,仅显示空白屏幕
解决Core Profile下OpenGL无法渲染三角形的问题
嘿,我明白你这种明明编译链接都没问题,却死活看不到三角形的郁闷——我当初学OpenGL的时候也踩过这个坑!仔细看了你的代码,问题出在OpenGL 3.3 Core Profile对VAO的强制要求上:
Core Profile模式下,OpenGL要求所有顶点数据的配置(比如顶点属性指针、启用属性数组)必须关联到一个VAO(顶点数组对象),而你的代码里只创建了VBO,完全没碰VAO。兼容模式下会有默认VAO,但Core Profile直接砍掉了这个“福利”,所以你的顶点配置根本没被OpenGL识别到,自然就渲染不出东西了。
具体修改步骤
只需要在创建VBO之前,新增VAO的创建和绑定代码就行:
// 新增:创建并绑定VAO GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao);
绑定VAO之后,后续的glVertexAttribPointer和glEnableVertexAttribArray操作都会被存在这个VAO里,只要保持VAO的绑定状态(或者绘制前重新绑定),OpenGL就能正确读取你的顶点配置了。
修改后的完整关键代码片段
int main() { int width = 0, height = 0; glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); GLFWwindow* window = glfwCreateWindow(500, 500, "Test", nullptr, nullptr); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); glfwSetKeyCallback(window, keyCallBack); // 新增VAO创建与绑定 GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); float triangle[] = { -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f }; GLuint buffer = 0; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); glEnableVertexAttribArray(0); // 后续着色器创建、绘制逻辑保持不变 std::string vertexShader = "#version 330 core\n" "layout (location = 0) in vec4 position;\n" "void main()\n" "{\n" "gl_Position = position;\n" "}\n"; std::string fragmentShader = "#version 330 core\n" "out vec4 color;\n" "void main()\n" "{\n" "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n"; unsigned int program = createShader(vertexShader, fragmentShader); glUseProgram(program); while(!glfwWindowShouldClose(window)) { glfwPollEvents(); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); } glfwTerminate(); return 0; }
改完之后再运行,应该就能看到那个橙色的三角形了!
内容的提问来源于stack exchange,提问作者Korsarq
相关产品推荐
相关产品推荐

