- iOS アプリで動作するレンダリング エンジンがあります。
- 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";