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

Qt着色器程序为何无版本声明?对应GLSL版本是多少?

Qt OpenGL示例无版本声明着色器的GLSL版本判定

我了解到着色器一般需要以版本声明开头,但在Qt的OpenGL Window示例中,提供的着色器代码没有版本声明,想确认对应的GLSL版本。相关代码如下:

static const char *vertexShaderSource = 
    "attribute highp vec4 posAttr;\n" 
    "attribute lowp vec4 colAttr;\n" 
    "varying lowp vec4 col;\n" 
    "uniform highp mat4 matrix;\n" 
    "void main() {\n" 
    "   col = colAttr;\n" 
    "   gl_Position = matrix * posAttr;\n" 
    "}\n"; 

static const char *fragmentShaderSource = 
    "varying lowp vec4 col;\n" 
    "void main() {\n" 
    "   gl_FragColor = col;\n" 
    "}\n"; 

版本判定及依据

这段着色器代码对应的是GLSL ES 1.00(对应OpenGL ES 2.0),同时也兼容桌面端的GLSL 1.20,不过Qt该跨平台示例更偏向使用GLSL ES 1.00,核心依据有三点:

  • 关键字使用:顶点着色器输入用attribute、顶点到片段的插值变量用varying,这是GLSL ES 1.00的标准写法;桌面端GLSL 1.30及以上版本已经改用in/out替代这两个关键字。
  • 精度限定符:代码里明确使用highp/lowp这类精度限定符,这是GLSL ES的强制要求(桌面GLSL中精度限定符是可选的,有默认精度规则),是GLSL ES的典型标识。
  • 片段着色器输出:使用gl_FragColor作为默认输出变量,这符合GLSL ES 1.00的规范;而桌面端GLSL 1.30+需要自定义out变量来指定输出。

如果是纯桌面OpenGL环境下,无版本声明的GLSL会默认回退到GLSL 1.10(对应OpenGL 2.0),但结合精度限定符的强制使用特征,该示例的着色器显然是针对GLSL ES 1.00编写的,这也是Qt跨平台示例的常见选择,能同时适配移动设备和桌面设备。

内容的提问来源于stack exchange,提问作者KcFnMi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:43