1
  1. 我有一个适用于 iOS 应用程序的渲染引擎。
  2. 我几乎设法通过从带有 QGLWidget 的 qt(4.8) 应用程序调用相同的 openGL 渲染引擎来使其工作。为了支持 es2 功能集,我的小部件还继承了 QGLFunctions。

但是我仍然对着色器有问题:我无法在 qt 上使用 glCompileShader 编译它们,因为几乎每个关键字(lowp、vec4、vec2 ...)都返回编译错误。所以我用QGLShader程序编译它,但我必须指定“#version 120”,最接近es2。但是,我的精灵没有显示正确的大小,唯一可能影响 iOS 的不同代码片段是在着色器编译/版本中。我认为着色器中的问题是 gl_PointSize 没有改变 qt 的顶点着色器编译中的任何内容。

有没有更好的方法让我像在 iOS 上一样在 qt 上编译着色器?(我知道 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";
4

1 回答 1

0

终于解决了这个问题!

我保留了#version 120,并发现了它在设备上工作时缺少的东西。在使用 qt(现在为 5.0)的桌面上,您必须激活以下在 iOS 上似乎默认的 gl 功能:

  glEnable(GL_POINT_SPRITE);
  glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
于 2013-02-06T11:38:57.867 回答