我正在使用Qt编写游戏,我已经实现了一些后处理着色器,使其看起来更有趣。它工作正常,直到我升级到linux mint 16,现在我总是得到一个需要精度说明符的错误,这只在编译片段着色器时才会发生。 因为代码在android构建中编译并且工作正常,我认为这是因为QGLShaderProgram在桌面构建中编译时,将shaider的开头添加了mediump,highp和lowp作为定义。
所以我的问题是:有没有办法让glsl编译器停止需要精确说明符,还是应该研究如何禁用这些定义?
代码:
isOk = m_displaceShader.addShaderFromSourceCode(QGLShader::Vertex,
"#version 100 \n"
"attribute mediump vec4 in_verts; \n"
"varying mediump vec2 out_tex; \n"
"void main(void) \n"
"{ \n"
" gl_Position = in_verts; \n"
" out_tex = (in_verts.xy + vec2(1.0)) * 0.5; \n"
"} \n");
qDebug() << m_displaceShader.log();
isOk &= m_displaceShader.addShaderFromSourceCode( QGLShader::Fragment,
"#version 100 \n"
"uniform sampler2D inCol; \n"
"uniform sampler2D inDisplace; \n"
"varying mediump vec2 out_tex; \n"
"void main(void) \n"
"{ \n"
" mediump vec4 displaceCol = texture2D(inDisplace, out_tex); \n"
" mediump float dispX = (displaceCol.r - 0.5) * 0.2; \n"
" mediump float dispY = (displaceCol.g - 0.5) * 0.2; \n"
" mediump vec2 texPlace = out_tex + vec2(dispX, dispY); \n"
" gl_FragColor = texture2D(inCol, texPlace); \n"
#ifdef DEBUG_SHADERS
" gl_FragColor = 0.5 * pow(texture2D(inCol, texPlace), vec4(1.0/2.2)) + 0.5 * displaceCol; \n"
#endif
"} \n"
);
错误:
QGLShader::compile(Fragment): 0:7(16): error: no precision specified this scope for type `vec2'
0:10(9): error: no precision specified this scope for type `vec4'
0:11(10): error: no precision specified this scope for type `float'
0:12(10): error: no precision specified this scope for type `float'
0:13(9): error: no precision specified this scope for type `vec2'
答案 0 :(得分:5)
您使用的是#version 100
,不是有效的桌面GLSL版本指令。请参阅GLSL 4.40 spec(强调我的)中的以下引用:
任何代表编译器所不具备的语言版本的数字 支持将导致生成编译时错误。版本1.10 该语言不需要着色器包含此指令, 并且将处理不包含
#version
指令的着色器 作为目标版本1.10。 指定#version 100
的着色器将是 被视为OpenGL ES着色语言的目标版本1.00。
这是为了与GLES兼容,GLES SL需要这些精度说明符,因此编译器是正确的。
答案 1 :(得分:1)
如果您在GLSL ES 片段 着色器中建立默认精度,问题就会自行解决。
与顶点着色器不同,片段着色器没有默认值。如果您将precision float mediump;
添加到片段着色器的顶部(在#version
指令之后),则可以解决您的问题。
您还可以实际编译桌面GL着色器(例如#version 110
),但是您的精度限定符将生成解析错误,因此您需要将其删除。