Qt桌面着色器编译问题

时间:2014-05-25 08:17:55

标签: c++ qt opengl glsl

我正在使用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'

2 个答案:

答案 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),但是您的精度限定符将生成解析错误,因此您需要将其删除。