1

バッファをシェーダの属性にバインドすると、それらが反転しているように見えます。

だから、私は頂点シェーダーを持っています:

precision highp float;

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec3 in_position;
in vec3 in_color;

out vec3 ex_Color;

void main(void)
{ 
  gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1);
  ex_Color = in_color;
}

とフラグメントシェーダー

precision highp float;

in vec3 ex_Color;

out vec4 out_frag_color;

void main(void)
{
  out_frag_color = vec4(ex_Color, 1.0);
}

複雑すぎることはありません。2つの入力があります。1つは頂点の位置用で、もう1つは色用です。(初心者として、私はまだテクスチャやライトを扱いたくありませんでした。)

ここで、クライアントコードで、データを2つのベクトル配列、positionVboDataとcolorVboDataに配置し、VBOを作成します...

GL.GenBuffers(1, out positionVboHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle);
GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                       new IntPtr(positionVboData.Length * Vector3.SizeInBytes),
                       positionVboData, BufferUsageHint.StaticDraw);

GL.GenBuffers(1, out colorVboHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle);
GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                new IntPtr(colorVboData.Length * Vector3.SizeInBytes),
                colorVboData, BufferUsageHint.StaticDraw);

次に、次のコードがvboをシェーダーの属性にバインドするように機能することを期待します。

    GL.EnableVertexAttribArray(0);
    GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle);
    GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0);
    GL.BindAttribLocation(shaderProgramHandle, 0, "in_position");

    GL.EnableVertexAttribArray(1);
    GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle);
    GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0);
    GL.BindAttribLocation(shaderProgramHandle, 1, "in_color");

しかし、実際には、最後のコードサンプルでpositionVboHandleとcolorVboHandleを交換する必要があり、それで完全に機能します。しかし、それは私には逆に思えます。私は何が欠けていますか?


アップデート

何か奇妙なことが起こっています。頂点シェーダーをこれに変更すると、次のようになります。

precision highp float;

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec3 in_position;
in vec3 in_color;

out vec3 ex_Color;

void main(void)
{
  gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1);
  //ex_Color = in_color;
  ex_Color = vec3(1.0, 1.0, 1.0);
}"

また、他の変更は行いません(すべてのセットアップ後にプログラムリンクを移動するように提案された修正を除いて、正しい属性である頂点位置をin_colorではなくin_positionにロードします。

4

2 に答える 2

4

GL.BindAttribLocationは、GL.LinkProgramの前に実行する必要があります。このコードフラグメントの後にGL.LinkProgramを呼び出していますか?

編集:更新への回答-in_colorを使用していないため、OpenGLはこの入力を単に無視します。また、頂点シェーダーは入力としてin_positionのみを取得します。ほとんどの場合、ロケーション0でバインドされます。これが、コードが機能する理由です。上記のリンクで説明されているように、プログラムをリンクする前に場所をバインドする必要があります。

于 2012-07-20T03:12:43.193 に答える
0

それで、MārtiņšMožeikoの助けを借りて、私はこれを理解することができました。LinkProgramの前にBindAttribLocationを正しく呼び出していました。ただし、属性の場所をバインドする前に、GL.CreateProgram()を呼び出していませんでした。

于 2012-07-22T17:09:18.593 に答える