如何在qt编译和放大器中制作着色器在es2(iOS)中工作?

时间:2012-12-19 17:36:07

标签: qt opengl-es-2.0 glsl

  1. 我有一个适用于iOS应用的渲染引擎。
  2. 我几乎设法通过使用QGLWidget从qt(4.8)app调用相同的openGL渲染引擎来使其工作。为了支持es2功能集,我的小部件也继承了QGLFunctions。
  3. 但是我仍然遇到着色器的问题:我无法使用glCompileShader在qt上编译它们,因为几乎每个关键字(lowp,vec4,vec2 ......)都返回了编译错误。所以我用QGLShader程序编译它,但我不得不指定“#version 120”,最接近es2。但是,我的精灵没有显示正确的大小,唯一可能影响iOS的不同代码片段是着色器编译/版本。我认为着色器中的问题是gl_PointSize在qt的顶点着色器编译中没有改变任何东西。

    有没有更好的方法让我在qt上编译着色器就像在iOS上一样? (我知道glsl es2版本来自120版,但我不知道它们的差异程度如何)。

    我的着色器,在iOS上运行良好但在Qt上运行良好:

    const GLchar vShaderStr[] =
    #ifdef  QT_OPENGL_LIB
    "#version 120\n"
    #endif //QT_OPENGL_LIB
    "attribute lowp vec4 Position;\n"
    "attribute mediump vec2 TextureCoord;\n"
    "attribute lowp float Weight;\n"
    "uniform mat4 MVP;\n"
    "varying mediump vec2 TextureCoordOut;\n"
    "void main(void)\n"
    "{\n"
    "  gl_Position = MVP * Position;\n"
    "  TextureCoordOut = TextureCoord;\n"
    "  gl_PointSize = Weight;\n"
    "}\n";
    
    const GLchar fShaderStr[] =
    #ifdef  QT_OPENGL_LIB
    "#version 120\n"
    #endif //QT_OPENGL_LIB
    "varying mediump vec2 TextureCoordOut;\n"
    "uniform sampler2D Sampler;\n"
    "uniform bool IsSprite;\n"
    "uniform lowp vec3 TextureColor;\n"
    "uniform lowp float Opacity;\n"
    "void main(void)\n"
    "{\n"
    "   lowp vec4 textureColorResult;\n"
    "   textureColorResult = texture2D(Sampler,  IsSprite ? gl_PointCoord : TextureCoordOut);\n"
    "   gl_FragColor = IsSprite ? vec4(mix(textureColorResult.rgb,TextureColor, 1.0),\n"
    "                    textureColorResult.a * Opacity) : textureColorResult;\n"
    "}\n";
    

1 个答案:

答案 0 :(得分:0)

终于解决了这个问题!

我保留了#version 120并找到了它所缺少的功能,就像在设备上一样。 在具有qt(现在5.0)的桌面上,您必须激活以下似乎在iOS上默认的gl函数:

  glEnable(GL_POINT_SPRITE);
  glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);