OpenGL报错:未识别布局标识符`binding`,求排查解决
问题描述
片段着色器代码
#version 330 layout(std430, binding = 0) buffer TVertex { mediump vec4 vertex[]; };
运行错误信息
error: unrecognized layout identifier `binding'
SDL OpenGL上下文设置代码
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 );
当前显卡环境
Mesa DRI Intel(R) HD Graphics 4400 (HSW GT2)
4.5 (Core Profile) Mesa 21.2.6
疑问
请问哪里操作出错了?
问题原因及解决办法
核心问题:GLSL 330(对应OpenGL 3.3核心版)不支持
layout中的binding布局限定符。这个特性是在GLSL 420(对应OpenGL 4.2)才纳入核心标准的,更早版本只能通过扩展启用。两种解决方式:
升级GLSL与OpenGL版本
把着色器开头的#version 330改为#version 420,同时调整SDL的上下文版本设置:SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 4 ); SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 2 );你的显卡支持OpenGL 4.5,完全兼容该版本。
保留3.3版本,启用扩展
在着色器开头添加扩展声明,同时指定核心版本:#version 330 core #extension GL_ARB_shader_storage_buffer_object : require layout(std430, binding = 0) buffer TVertex { mediump vec4 vertex[]; };Mesa 21.2.6对Intel HD4400完全支持
GL_ARB_shader_storage_buffer_object扩展,无需额外配置。
另外补充:OpenGL 3.3中若不使用扩展,不能在着色器里用binding指定缓冲区绑定点,只能通过glBindBufferBase或glBindBufferRangeAPI手动绑定缓冲区到对应索引。
内容的提问来源于stack exchange,提问作者samawaat
相关产品推荐
相关产品推荐

