使用GLFW、GLAD在C++中绘制三角形失败求助
使用GLFW+GLAD绘制三角形的问题修复
问题简述
按照教程实现C+++GLFW+GLAD绘制三角形,程序无法正常运行,需在保留原有实现逻辑的前提下修复问题。
核心错误点
- 冗余FBO代码干扰VBO绑定:错误创建了
GL_ARRAY_BUFFER类型的FBO(变量名fboID),覆盖了之前绑定的VBO,导致顶点数据无法正确关联到VAO。 - 着色器编译状态检查对象错误:检查片段着色器编译状态时,误用了顶点着色器ID(
vertexshaderID),无法正确检测片段着色器的编译问题。 glShaderSource参数不规范:最后一个参数使用非标准的null,C++中应使用nullptr或NULL。- 顶点属性指针设置时机不当:正确流程是绑定VBO后立刻设置顶点属性指针,原代码延迟到删除着色器后,虽不致命但不符合规范。
修复后的完整代码
着色器代码
const char* vertexSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "out vec3 currentPos;\n" "void main() {\n" "gl_Position = vec4(position.x, position.y, position.z, 1.0f);\n" "currentPos = position;\n" "}"; const char* fragmentSource = "#version 330 core\n" "in vec3 currentPos;\n" "out vec4 colour;\n" "void main() {\n" "colour = vec4(currentPos.x + 0.5, currentPos.y + 0.5, currentPos.z + 1.0, 1.0);\n" "}";
注:移除了字符串末尾多余的
\0,GLSL字符串无需手动添加终止符。
循环前初始化代码
float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.5f, 0.0f, 0.5f, 0.0f }; unsigned int vaoID; glGenVertexArrays(1, &vaoID); glBindVertexArray(vaoID); unsigned int vboID; glGenBuffers(1, &vboID); glBindBuffer(GL_ARRAY_BUFFER, vboID); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 绑定VBO后立即设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // 编译顶点着色器 unsigned int vertexshaderID = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexshaderID, 1, &vertexSource, nullptr); glCompileShader(vertexshaderID); int success; glGetShaderiv(vertexshaderID, GL_COMPILE_STATUS, &success); // 建议保留错误检查:若success为0,打印编译日志 // 编译片段着色器 unsigned int fragmentshaderID = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentshaderID, 1, &fragmentSource, nullptr); glCompileShader(fragmentshaderID); glGetShaderiv(fragmentshaderID, GL_COMPILE_STATUS, &success); // 修正为片段着色器ID // 建议保留错误检查:若success为0,打印编译日志 // 链接着色器程序 unsigned int shaderProg = glCreateProgram(); glAttachShader(shaderProg, vertexshaderID); glAttachShader(shaderProg, fragmentshaderID); glLinkProgram(shaderProg); glGetProgramiv(shaderProg, GL_LINK_STATUS, &success); // 建议保留错误检查:若success为0,打印链接日志 glUseProgram(shaderProg); glDeleteShader(vertexshaderID); glDeleteShader(fragmentshaderID);
注:删除冗余FBO创建代码,修正着色器检查ID,调整顶点属性指针设置时机,替换
null为nullptr。
循环内绘制代码
glUseProgram(shaderProg); glBindVertexArray(vaoID); glDrawArrays(GL_TRIANGLES, 0, 3);
注:原绘制代码逻辑正确,无需修改。
内容的提问来源于stack exchange,提问作者CloudBeta
相关产品推荐
相关产品推荐

