You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:41:18