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
相关产品推荐
相关产品推荐

