Qt桌面着色器编译问题

Rad*_*ivu 2 c++ opengl qt glsl

我正在使用Qt编写游戏,我已经实现了一些后期处理着色器,使其看起来更有趣.它工作正常,直到我升级到linux mint 16,现在我总是得到一个需要精度说明符的错误,这只在编译片段着色器时才会发生.因为代码在android构建时编译并且工作正常,我认为这是因为QGLShaderProgram在桌面构建中编译时,将着色器添加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"
    );
Run Code Online (Sandbox Code Playgroud)

错误:

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'
Run Code Online (Sandbox Code Playgroud)

der*_*ass 5

您正在使用#version 100,这不是有效的桌面GLSL版本指令.请参阅GLSL 4.40规范中的以下引用(强调我的):

表示编译器不支持的语言版本的任何数字都将导致生成编译时错误.该语言的1.10版本不要求着色器包含此指令,并且不包含#version指令的着色器将被视为目标版本1.10.指定的着色器#version 100将被视为OpenGL ES着色语言的目标版本1.00.

这是为了与GLES兼容,GLES SL需要这些精度说明符,因此您的编译器是正确的.