以下のLWJGL 3コードは、三角形を描画するためのバッファなどを設定します。私は三角形を見ることができます。今私は何が起こっているのかを正確に理解しようとしています。頂点バッファデータを配列頂点データフロー
以下のコードを理解しました。最初に頂点バッファオブジェクトを作成します。頂点バッファオブジェクトは、数値の配列の単なるコンテナです。 glBindBuffer()およびglBufferData()は、頂点バッファオブジェクトを頂点配列で塗りつぶします。 2番目の頂点の配列に対してこれを再度実行します。その後、頂点シェーダとフラグメントシェーダをコンパイルし、シェーダプログラムに追加します。何らかの形で、このプログラムは第2の頂点バッファオブジェクトのデータにアクセスします。
次に、頂点配列オブジェクトをバインドします。シェーダプログラムの出力をポピュレートします。シェーダプログラムは、2番目の頂点バッファオブジェクトから頂点データを処理しました。
質問
このセットアップは頂点データの複数の部分は、コマンドの同じセットによって処理されることを可能にすることであるように見えます。コードの最後に、第2の頂点データではなく最初の頂点データを渡すためのコマンドを教えてください。すべての頂点バッファオブジェクトに対して別々の頂点配列オブジェクトを作成する必要がありますか、またはパイプの下に異なるバッファを送り、同じ頂点配列オブジェクトを保持できますか?
コード
ここで私は上記参照したコードです: まず、変数は以下のとおりです。
//The vertices of a triangle
float[] vertices = new float[] {
0.0f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f
};
//Vertices of the second triangle
float[] vertices2 = new float[] {
0.0f, 0.9f,
0.5f, -0.5f,
-0.5f, -0.5f
};
//The source for the vertex shader
String vertexShaderSrc =
"#version 300 es\n\n" +
"precision mediump float;\n" +
"in vec2 position;\n\n" +
"void main()\n" +
"{\n" +
"gl_Position = vec4(position, 0.0, 1.0);\n" +
"}";
int vertexShader;
//The source for the fragment shader
String fragmentShaderSrc =
"#version 300 es\n\n" +
"precision mediump float;\n" +
"out vec4 outColor;\n\n" +
"void main()\n" +
"{\n" +
"outColor = vec4(1.0, 1.0, 1.0, 1.0);\n" +
"}";
int fragmentShader;
int shaderProgram;
//The position attribute
int posAttrib;
//A vertex buffer object handle.
int vbo;
//A second vertex buffer object handle.
int vbo2;
//A vertex array object handle.
int vao;
それらを使用するコード・セグメントは次のとおりです。
vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
vbo2 = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, vertices2, GL_STATIC_DRAW);
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, vertexShaderSrc);
glCompileShader(vertexShader);
System.out.println(glGetShaderInfoLog(vertexShader));
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, fragmentShaderSrc);
glCompileShader(fragmentShader);
System.out.println(glGetShaderInfoLog(fragmentShader));
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
vao = glGenVertexArrays();
glBindVertexArray(vao);
posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(posAttrib);