如何在qt中使着色器编译并像在es2(iOS)中一样工作?


  1. 我有一个在iOS应用程序上使用的渲染引擎。
  2. 我几乎设法通过带有QGLWidget的QT(4.8)应用程序调用相同的OpenGL渲染引擎来使其正常工作。为了支持ES2函数设置我的小部件也继承了QGLFUNCTIONS。

但是,我仍然对着色器有问题:由于几乎所有关键字(Lowp,vec4,vec2 ...)都在返回编译错误,因此我无法使用GlCompileShader在QT上编译它们。因此,我使用QGLSHADER程序进行了编译,但是我必须指定" #version 120",最接近ES2。但是,我的精灵仍然没有显示正确的尺寸,唯一可能会影响iOS的不同代码的唯一可能是在着色器汇编/版本中。我认为着色器中的问题是gl_pointsize不更改QT汇编中的任何内容。

我有什么更好的方法可以像iOS上的QT一样在QT上编译着着色器?(我知道GLSL ES2版本来自版本120,但我不知道它们有多大不同)。

我的着色器,在iOS上工作良好,但在QT上不工作:

const GLchar vShaderStr[] =
#ifdef  QT_OPENGL_LIB
"#version 120n"
#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 120n"
#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";

最终解决了这个问题!

我保留了#version 120,并找到了像在设备上一样工作所缺少的。在带有QT的桌面上(现在5.0),您必须在iOS上默认的GL功能之后激活:

  glEnable(GL_POINT_SPRITE);
  glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);

相关内容

最新更新