1
  1. iOS アプリで動作するレンダリング エンジンがあります。
  2. QGLWidget を使用して qt(4.8) アプリから同じ openGL レンダリング エンジンを呼び出すことで、ほとんど機能させることができました。es2 関数セットをサポートするために、私のウィジェットは QGLFunctions も継承します。

ただし、シェーダーにはまだ問題があります。ほとんどすべてのキーワード (lowp、vec4、vec2 ...) がコンパイル エラーを返すため、glCompileShader を使用して qt でコンパイルできませんでした。QGLShader プログラムでコンパイルしましたが、es2 に最も近い "#version 120" を指定する必要がありました。それでも、スプライトが適切なサイズで表示されず、iOS のさまざまなコードに影響を与える可能性があるのは、シェーダーのコンパイル/バージョンだけです。シェーダーの問題は、qt の頂点シェーダーのコンパイルで gl_PointSize が何も変更されていないことだと思います。

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 に答える