2016-10-22 29 views
0

以下の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); 

答えて

0

「それこの設定は、複数の頂点データを同じコマンドセットで処理できるようにしているように見えます " - はい、ウィジェットを渡すことができます頂点位置、テクスチャ座標、頂点の色などのデータを含む頂点バッファオブジェクトをさらに追加することによって、頂点配列オブジェクトの呼び出しをレンダリングします。シェーダのような位置に送られた頂点データを変更したい場合は、オブジェクトを移動、拡大縮小、回転させるためにuniformとして渡されたtransformation matrixを使用することができます。しかし、オブジェクトが異なるモデルの場合は、異なるvaosを使用する必要があります。

関連する問題