私はSDL 1.3の公式のAndroidポートを使用しており、それを使ってGLES2レンダラーを設定しています。これはほとんどのデバイスで動作しますが、1人のユーザーにとっては動作しません。ログ出力には次のエラーが表示されます。GL_NUM_SHADER_BINARY_FORMATSのglGetIntegervがGL_INVALID_ENUMを生成するのはなぜですか?
error of type 0x500 glGetIntegerv
私は0x500を検索し、GL_INVALID_ENUMを参照しています。私はSDLライブラリ内の次のコードに問題がどこで発生したかを追跡しました。(完全なソースはかなり大きく、ロギングと基本的なエラーチェック行を省略しています。 )
glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &nFormats);
glGetBooleanv(GL_SHADER_COMPILER, &hasCompiler);
if(hasCompiler)
++nFormats;
rdata->shader_formats = (GLenum *) SDL_calloc(nFormats, sizeof(GLenum));
rdata->shader_format_count = nFormats;
glGetIntegerv(GL_SHADER_BINARY_FORMATS, (GLint *) rdata->shader_formats);
直ちに最後の行(GL_SHADER_BINARY_FORMATS用glGetIntegerv)後、glGetError()はGL_INVALID_ENUMを返します。
これは主に推測ですが、正しく読めばこの仕様ではデバイスがバイナリシェーダフォーマットをサポートしていない可能性があります(GL_NUM_SHADER_BINARY_FORMATS == 0の場合、誰もGL_SHADER_BINARY_FORMATSを呼び出すことはできません) 。 – harism
ありがとう、それは妥当と思われます。ゼロが戻り値であるかどうかを確認し、この部分をスキップすると後で他の問題が発生するかどうかを確認します。 – paulscode
GL_NUM_SHADER_BINARY_FORMATS == 1となります(上記のコード例では、 "hasCompiler"がtrueであるため、nFormatsは2になります)。しかし、GL_SHADER_BINARY_FORMATSのglGetIntegervは引き続きGL_INVALID_ENUMを引き起こしています。私は、問題が発生したときにゼロシェーダーバイナリ形式があることをコードに伝えることで問題を回避しましたが、なぜこれが起きているのか把握したいと思います。しかし、チップをおかげさまで、ありがとうございました。もしあなたがそれを提案していなかったら、回避策を出すのにもっと時間がかかりました! – paulscode