gpt4 book ai didi

c++ - 正确更新顶点缓冲对象

转载 作者:行者123 更新时间:2023-11-28 02:38:57 25 4
gpt4 key购买 nike

<分区>

我有一个用 winapi 编写的培训应用程序所以,我在那里初始化了 GL,并且我有基于节点的系统,可以用几个类来描述

class mesh
{
GLuint vbo_index; //this is for having unique vbo
float *vertex_array;
float *normal_array;
unsigned int vertex_count;

etc.. //all those mesh things.
....
}

class node
{
bool is_mesh; //the node may or may not represent a mesh
mesh * mesh_ptr; //if it does then this pointer is a valid address
}

我还有 2 个全局变量用于保存可渲染网格的记录..

mesh **mesh_table;
unsigned int mesh_count;

现在我正在对 2 个对象进行实验。所以我创建了 2 个类型为 mesh::cube 的节点,具有可自定义的 x y 和 z 段数。我的应用程序的预期行为是让用户在节点 CUBE0、CUBE1 中的 2 个之间单击并显示它们的可自定义属性 - 段 x、段 y、段 z。用户调整两个对象的参数,它们在线框模式下相互叠加渲染,因此我们可以实时看到它们拓扑结构的变化。

第一次创建节点时,如果节点类型为mesh,则生成mesh对象并将其mesh_ptr写入mesh_tablemesh_count 增量。之后,我的 opengl 窗口类为新网格创建了一个独特的顶点缓冲区对象,并将其索引存储在 mesh_ptr.vbo_index

void window_glview::add_mesh_to_GPU(mesh* mesh_data)
{
glGenBuffers(1,&mesh_data->vbo_index);
glBindBuffer(GL_ARRAY_BUFFER ,mesh_data->vbo_index);
glBufferData(GL_ARRAY_BUFFER ,mesh_data->vertex_count*3*4,mesh_data->vertex_array,GL_DYNAMIC_DRAW);
glVertexAttribPointer(5,3,GL_FLOAT,GL_FALSE,0,NULL);//set vertex attrib (0)
glEnableVertexAttribArray(5);
}

之后,用户可以调整参数,每次参数值更改时,都会根据新参数值重新评估对象的网格信息,同时仍然是相同的网格实例,之后 VBO 数据被由

更新
void window_glview::update_vbo(mesh *_mesh)
{
glBindBuffer(GL_ARRAY_BUFFER,_mesh->vbo_vertex);
glBufferData(GL_ARRAY_BUFFER,_mesh->vertex_count*12,_mesh->vertex_array,GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);
}

整个场景由

重绘
for (unsigned short i=0;i<mesh_count;i++)
draw_mesh(mesh_table[i],GL_QUADS,false);
SwapBuffers(hDC);

单个网格的函数是

bool window_glview::draw_mesh(mesh* mesh_data,unsigned int GL_DRAW_METHOD,bool indices)
{
glUseProgram(id_program);
glBindBuffer(GL_ARRAY_BUFFER,mesh_data->vbo_index);
GLuint id_matrix_loc = glGetUniformLocation(id_program, "in_Matrix");
glUniformMatrix4fv(id_matrix_loc,1,GL_TRUE,cam.matrixResult.get());
GLuint id_color_loc=glGetUniformLocation(id_program,"uColor");

glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glUniform3f(id_color_loc,mesh_color[0],mesh_color[1],mesh_color[2]);
glDrawArrays(GL_DRAW_METHOD,0,mesh_data->vertex_count);
glBindBuffer(GL_ARRAY_BUFFER,0);
glUseProgram(0);
return true;
}

问题是只有堆栈中的最后一个对象以这种方式绘制,而另一个对象的点都在 0 0 0 中,因此在视口(viewport)中它被渲染为一个具有适当参数的立方体和一个立方体就像一个 DOT enter image description here enter image description here

问题:我哪里出错了?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com