了解VAO并向VAO添加不同的arrays

我真的很困惑你做什么。 我可以做他们,但是我有这个问题。 假设你有几个方块,比如说1000个方块。 现在我可以为每个1000平方做一个VAO,然后做一些循环来渲染所有的方块。 我也可以使用着色器来移动正方形。

然而,是否有可能把所有1,000个方格放在一个VAO中。

问题是我要创建一个体素游戏。 所以我需要渲染约10000个立方体。 然而,即使我现在正在做200个格子,游戏也会滞后很多。

float points[] = { 0.0f, 0.0f, 0.0f, 0.3f, 0.0f, 0.0f, 0.3f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.3f, 0.0f, 0.3f, 0.3f, 0.0f }; float colours[] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; unsigned int points_vbo = 0; glGenBuffers (1, &points_vbo); glBindBuffer (GL_ARRAY_BUFFER, points_vbo); glBufferData (GL_ARRAY_BUFFER, 18 * sizeof (float), &points, GL_STATIC_DRAW); unsigned int colours_vbo = 0; glGenBuffers (1, &colours_vbo); glBindBuffer (GL_ARRAY_BUFFER, colours_vbo); glBufferData (GL_ARRAY_BUFFER, 18 * sizeof (float), &colours, GL_STATIC_DRAW); unsigned int vao = 0; glGenVertexArrays (1, &vao); glBindVertexArray (vao); glBindBuffer (GL_ARRAY_BUFFER, points_vbo); glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL); glBindBuffer (GL_ARRAY_BUFFER, colours_vbo); glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); //Setup shaders std::string vertex_shader = loadshaders("test_vs.txt"); std::string fragment_shader = loadshaders("test_fs.txt"); unsigned int vs = glCreateShader (GL_VERTEX_SHADER); const char* str = vertex_shader.c_str (); glShaderSource (vs, 1, &str, NULL); glCompileShader (vs); unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER); const char* strb = fragment_shader.c_str (); glShaderSource (fs, 1, &strb, NULL); glCompileShader (fs); unsigned int shader_programme = glCreateProgram (); glAttachShader (shader_programme, fs); glAttachShader (shader_programme, vs); glLinkProgram (shader_programme); // main loop while (!glfwWindowShouldClose(window)) { float ratio; int width, height; glfwGetFramebufferSize(window, &width, &height); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor (0.6f, 0.6f, 0.8f, 1.0f); glUseProgram (shader_programme); glBindVertexArray (vao); glDrawArrays (GL_TRIANGLES, 0, 6); glfwSwapBuffers(window); glfwPollEvents(); } 

那么我怎么会说添加points2 [],points3 [],并把它们放在同一个VAO。 我如何devise我的着色器,然后我可以在数组中的点进行转换说转换points2 []数组4块正确,没有影响其他每一个点。

你可以在着色器中做, 它使事情变得非常复杂。

所以我想的替代方法是把你的几何graphics烧成一个VBO / VAO,比如说… 16x16x16盒/体素。 如果您需要更改该数据,只需更改该数据并将VBO / VAOreplace为该数据即可。

你还需要一些Shader对象的抽象,我称之为缓冲区(管理VBO / VAO的gometry),在缓冲区中需要dynamic分配/重新分配/释放内存,不要使用静态数组。