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

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)才纳入核心标准的,更早版本只能通过扩展启用。

  • 两种解决方式:

    1. 升级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,完全兼容该版本。

    2. 保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:14:54