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

