OpenGL (ES) アプリケーションを作成していますが、デバイスがソフトウェア レンダリングにフォールバックしているようです。これが発生する原因となっている API 呼び出し/デバイスの制限を特定するにはどうすればよいですか?
私の場合、これは OpenGL ES 2.0 を搭載した Raspberry Pi で発生していますが、理想的な答えは、より広い範囲の OpenGL バージョンと OS に適用されるはずです。
私は正直なところ、見つけるための適切な方法があるとは思いません。
グラフィックス カード ドライバーは、特定のバージョンの OpenGL に機能を提供します。私が知る限り、これらの機能にハードウェア サポートを提供する必要はなく、それらを要求するアプリケーションを処理できれば十分です。したがって、カードは OpenGL 4 などのサポートを主張できますが、OpenGL3 よりも新しいほとんどすべてのものは、単純にソフトウェアでレンダリングできます。
実行したいハードウェアのドキュメントを見つけて、何がハードウェア アクセラレーションされているかを確認できる場合があります。それができない場合は、使用する機能のリストをゆっくりと作成して、それがソフトウェア レンダリングに戻ってくるのを確認する必要があるかもしれません。
また、それがソフトウェア レンダリングを使用していることをどのように確認できますか?それはパフォーマンス ヒットだけですか? ハードウェアの機能をサポートしていても、非常にうまくいかない可能性があると思います。そもそもコンテキストを正しく作成していない可能性もあるため、最新バージョンを利用できません。
デバイスが GL_ARB_debug_output をサポートしている場合、デバッグ出力には、何かがソフトウェアでレンダリングされているか、パフォーマンスに問題があるかどうかの手がかりが含まれている可能性があります。
使用方法はドキュメントhttp://www.opengl.org/registry/specs/ARB/debug_output.txtで説明されています。 要するに、メッセージを受信するログ バッファまたはコールバック関数を設定する必要があります。
別のデバッグ拡張もあります http://www.opengl.org/registry/specs/KHR/debug.txtおそらく他にもいくつか存在します。
KHR 拡張機能を使用するには、コンテキストを適切に初期化する必要があります
EGLint ctx_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR,
EGL_NONE};
EGLContext *ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, ctx_attribs);
コールバックの設定
static void on_gl_error(enum source, enum type, uint id, enum severity,
sizei length, const char* message, void *userParam)
{
printf("%s\n", message);
}
static void enable_debug_callbacks(void)
{
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR, GL_TRUE);
glDebugMessageCallbackKHR(on_gl_error, NULL);
}
他のものもおそらく同様の方法で動作します。これを試す前に、サポートされている拡張機能を確認する必要があります。これは、呼び出しの戻りを調べることによって行われます。サポートされているすべての拡張機能のリストを含む文字列です。
glGetString(GL_EXTENSIONS);