0

通常、質問はヘッダーにあります。

関数の使い方がわかりませんGetActiveUniform

public void GetActiveUniform(uint program, 
                             uint index, 
                             int bufSize, 
                             int[] length, 
                             int[] size, 
                             uint[] type, 
                             string name);

私の試みは次のようになります(すべてがコンパイルされ、リンクされています):

        int[] numberOfUniforms = new int[1];
        Gl.GetProgram(programId, ProgramParameter.ActiveUniforms, numberOfUniforms);

        int[] uniformNameMaxLength = new int[1];
        Gl.GetProgram(programId, ProgramParameter.ActiveUniformMaxLength, uniformNameMaxLength);

        int unifromCount = numberOfUniforms[0];

        for (uint i = 0; i < unifromCount; i++)
        {
            var uniformSize = new int[1];
            var unifromLength = new int[1];
            var uniformType = new uint[1];
            string uniformName = "";

            Gl.GetActiveUniform(programId, i, uniformNameMaxLength[0], unifromLength, uniformSize, uniformType, uniformName);
        }

頂点シェーダー:

#version 150 core

in vec3 in_Position;
out vec3 pass_Color;
uniform vec3 color;

void main(void) {
    gl_Position = vec4(in_Position, 1.0);
    pass_Color = color;
}

呼び出し後、適切なuniformSize、長さ、およびタイプを取得しますが、名前は取得しません。

4

1 に答える 1

2

OpenGL の使用に関しては、これを正しく行っています。問題は、使用している SharpGL バインディングに起因します。最後のパラメーターは型であると宣言されておりstring、.NET では文字列は (ほとんど) 不変であるため、関数には名前を出力する方法がありません。バインディングを自分で変更する以外に、次の 2 つのオプションがあります。

  • SharpGLGetActiveUniformが、変更可能なオブジェクトを名前パラメーターとして取る別のオーバーロードを提供してStringBuilderいるchar[]かどうかを確認しますout string
  • 別のバインディング ライブラリを使用します。OpenTK は非常に優れた、クリーンでよく管理されたツールです。ref大量の 1 要素配列を作成する代わりに、パラメーターを使用します。強くお勧めします。
于 2014-05-29T12:54:12.070 に答える