簡體   English   中英

opengl:兩個不同的向量可以綁定到同一個頂點數組對象嗎?

[英]opengl : can two different vectors bind to the same vertex array object?

我有兩個向量,std::vector col 和 std::vector pos,

我的着色器如下:

const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec2 position;\n"
"layout (location = 1) in vec3 PColor;\n"
"out vec3 color;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, 0.0, 1.0);\n"
"color = PColor;\n"
"}\0";


 const GLchar* fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"in vec4 PColor;\n"
"void main()\n"
"{\n"
"color = PColor;\n"
"}\n\0";

我可以執行以下操作將 pos 和 col 綁定到同一個 VAO

void CreateVertexBuffer()
{
glGenBuffers(1, &posbuffer);
glGenVertexArrays(1, &VAO);
glBindBuffer(GL_ARRAY_BUFFER, posbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(int) * pos.size(), &pos.front(), GL_STATIC_DRAW);
glBindVertexArray(VAO);
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 2 * sizeof(GL_INT), (GLvoid*)0);
glEnableVertexAttribArray(0);
//glBindVertexArray(0); delete
glGenBuffers(1, &colbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT) * col.size(),  &col.front(), GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);  
}

我想讓我的程序畫一個圓圈,但核心已轉儲,所以我認為我的 VAO 綁定可能存在一些問題。 謝謝!

  1. 您應該在生成 VBO 之前生成 VAO

     glGenVertexArrays(1, &vao[object_id]); glBindVertexArray(vao[object_id]); glGenBuffers(1, &vbo[0]); glBindBuffer(target, vbo[0]); glBufferData(target, size, data1, dataType); glEnableVertexAttribArray(h_Attributes[UV]); glVertexAttribPointer(h_Attributes[UV], 2, GL_FLOAT, 0, 0, 0); glGenBuffers(1, &vbo[1]); glBindBuffer(target, vbo[1]); glBufferData(target, size, data2, dataType); glEnableVertexAttribArray(h_Attributes[POSITION]); glVertexAttribPointer(h_Attributes[POSITION], 3, GL_FLOAT, 0, 0, 0);
  2. 位置向量必須是 float 而不是 int,因為它在着色器中是 vec2

  3. 我不確定,但如果不放 2 * sizeof(GL_INT) 和 3 * sizeof(GL_FLOAT)

更新當你繪制對象時,你必須綁定你生成的vao

  glBindVertexArray(vao[object_id]);

如果不更新數組的任何值,則不需要在渲染循環中綁定任何 vbo。 但是,如果您需要更新顏色或位置的頂點,則必須調用這些函數。

  glBindVertexArray(vao[object_id]);
  glBindBuffer(target, vbo[object_id]);   
  glBufferData(GL_ARRAY_BUFFER, sizeof(the_array), &the_array[0], GL_DYNAMIC_DRAW);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM