ゲームエンジンをPCからAndroidに移植しようとすると、同じように機能しないいくつかのOpenGL関数の障害に遭遇しましたが、その理由を理解するのに役立つドキュメントがありません。
問題はシェーダープログラムにあります。PCでは、OpenGLを介して属性とユニフォームをクエリし、キー付きコレクションを構築して、共通パラメーターの受け渡しを簡単に自動化できるようにします。
PCでは、次の関数を使用してキー付きコレクションを作成します。
void LoadUniforms()
{
int activeUniforms;
GL.GetProgram(m_ID, ProgramParameter.ActiveUniforms, out activeUniforms);
for (int i = 0; i < activeUniforms; i++)
{
int size;
ActiveUniformType type;
string name = GL.GetActiveUniform(m_ID, i, out size, out type);
ShaderUniform uniform = null;
uniform = new ShaderUniform(this, name, size, type);
if (uniform != null)
m_uniformParameters.Add(uniform);
}
}
次のようにOpenTKのGLES2.0に変換しようとしましたが、maxLengthとactiveUniformsでは常に0になります。
void LoadUniforms()
{
int length = 0;
int maxLength = 0;
GL.GetProgram(m_ID, All.ActiveUniformMaxLength, ref maxLength);
int activeUniforms = 0;
GL.GetProgram(m_ID, All.ActiveUniforms, ref activeUniforms);
for (int i = 0; i < activeUniforms; i++)
{
All type = All.None;
int size = 0;
string name = string.Empty;
GL.GetActiveUniform(m_ID, i, maxLength, ref length, ref size, ref type, name);
ShaderUniform uniform = new ShaderUniform(this, name, size, (ShaderUniformType)type);
if (uniform != null)
m_uniformParameters.Add(uniform);
}
}
そこで、Android.Openglの試用に移りました。おそらく、OpenTKのGLES 2.0インターフェイスが完全ではなかったのではないかと疑っていましたが、それでも同じ問題が発生しました。
だから今、私は質問を残されています。シェーダープログラムをコンパイルしてリンクし、アクティブなユニフォームをクエリできるようになるまでの間に、いくつかの手順がありませんか?また、アクティブな属性を照会しようとすると、まったく同じ問題が発生します(最大長とカウントは常に0になります)。
テストに使用している頂点シェーダーは次のとおりです。
uniform mat4 World;
uniform mat4 View;
uniform mat4 Projection;
attribute vec3 Posiiton;
attribute vec2 TexCoord;
varying vec2 TexCoord0;
void main()
{
mat4 worldViewProject = Projection * View * World;
vec4 pos = vec4(Position, 1);
pos *= World;
pos *= View;
pos *= Project;
gl_Position = pos;
TexCoord0 = TexCoord;
}
ゲームが使用するすべてのシェーダーを調べて、慣れ親しんだより自動化された方法に甘やかされた後、パラメーターを手動でマップする必要があるのは本当に嫌です。だから私はそれが私が逃したものだと本当に願っています。