バッファをシェーダの属性にバインドすると、それらが反転しているように見えます。
だから、私は頂点シェーダーを持っています:
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にロードします。