2

ゲームエンジンを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;
}

ゲームが使用するすべてのシェーダーを調べて、慣れ親しんだより自動化された方法に甘やかされた後、パラメーターを手動でマップする必要があるのは本当に嫌です。だから私はそれが私が逃したものだと本当に願っています。

4

1 に答える 1

0

さて、私はそれを理解しました、ある種。#includeステートメントを処理するために設定したプリプロセッサは、ファイルに引用符を1つ挿入しすぎて、EOL / EOF例外を生成していました。これは、実行を1行ずつ実行するまで、何らかの理由でスローされませんでした。見落としていたタイプミスが原因でシェーダーでコンパイルエラーが発生し始めたことを修正すると、その後はPCバージョンと同じように機能しました。

于 2012-09-24T22:03:44.897 に答える