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

GLFW3 OpenGL绘制正方形异常:线框显单线条/填充无内容求助

问题分析与解决方案

核心问题1:片段着色器编译检查逻辑错误

编译片段着色器后,代码错误地复用了顶点着色器的编译状态与日志,导致片段着色器编译失败时无法触发报错,着色器程序可能并未正常生效。

错误代码片段:

if(glGetShaderi(vertex, GL_COMPILE_STATUS) != GL_TRUE) {
    System.out.printf("Failed to compile FRAGMENT Shader: %s%n", glGetShaderInfoLog(vertex, Integer.MAX_VALUE));
    // ...
}

修正后:

if(glGetShaderi(fragment, GL_COMPILE_STATUS) != GL_TRUE) {
    System.out.printf("Failed to compile FRAGMENT Shader: %s%n", glGetShaderInfoLog(fragment, Integer.MAX_VALUE));
    // ...
}

核心问题2:顶点属性步长参数错误

glVertexAttribPointer的第5个参数要求传入字节步长,代码中使用Float.SIZE(返回float的位数,值为32)计算,导致步长被错误放大8倍,顶点数据解析完全混乱。需替换为Float.BYTES(返回float的字节数,值为4)。

错误代码片段:

glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * Float.SIZE, 0);

修正后:

glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * Float.BYTES, 0);

关键修正后的完整代码片段

着色器编译部分

final var fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, getResourceAsString("basic.frag"));
glCompileShader(fragment);
if(glGetShaderi(fragment, GL_COMPILE_STATUS) != GL_TRUE) {
    System.out.printf("Failed to compile FRAGMENT Shader: %s%n", glGetShaderInfoLog(fragment, Integer.MAX_VALUE));
    GL.destroy();
    glfwTerminate();
    System.exit(9);
}
glAttachShader(program, fragment);

顶点属性配置部分

glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * Float.BYTES, 0);
glEnableVertexAttribArray(0);

效果验证

修正后重新运行:

  • 设置glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)时,将显示正方形线框
  • 设置glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)时,将显示填充的橙色正方形

内容的提问来源于stack exchange,提问作者Bruno Araújo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:56