Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl VBO与顶点数组,VBO中的顶点法线问题_Opengl_Vbo_Normals - Fatal编程技术网

Opengl VBO与顶点数组,VBO中的顶点法线问题

Opengl VBO与顶点数组,VBO中的顶点法线问题,opengl,vbo,normals,Opengl,Vbo,Normals,我不知道这里出了什么问题,除了正常情况外,一切正常。 当我使用顶点数组时,模型看起来很完美,但当我切换到VBO时,由于顶点法线,模型看起来更糟糕。我花了很多时间来修复它,但不知道出了什么问题。VBO一代似乎很完美。但还是不知道。 有什么想法吗 #define BUFFER_OFFSET(i) ((char *)NULL + (i)) void InitVBO(){ glGenBuffers(1, &vboNormID); glBindBuffer(GL_ARRAY_BUFFER,

我不知道这里出了什么问题,除了正常情况外,一切正常。 当我使用顶点数组时,模型看起来很完美,但当我切换到VBO时,由于顶点法线,模型看起来更糟糕。我花了很多时间来修复它,但不知道出了什么问题。VBO一代似乎很完美。但还是不知道。 有什么想法吗

#define BUFFER_OFFSET(i) ((char *)NULL + (i))


void InitVBO(){

glGenBuffers(1, &vboNormID); 
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, VertNormals);
glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));

glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, p_VERTICES);
glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));


glGenBuffers(1, &indexVBOID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(GLFace)*nb_Faces, p_indices);

//glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}
下面是渲染代码。VBO+顶点数组 顶点数组工作正常。我可以看到带有顶点法线的模型的完美形状,但使用VBO时,顶点法线存在一些问题。我认为缓冲区偏移量(12)有问题

}

更新1:
我想你说的是InitVBO。。当时我错了。这个怎么样……但它也不起作用。。事实上,问题是。。在很多方面,我试图在InitVBO()中绑定顶点法线。。但每次的结果都是一样的

    glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, p_VERTICES);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, sizeof(GLpoint)*nb_Vertices, VertNormals);  
glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));
glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));
更新2: 好啊我不绑定顶点法线(vboNormID)。我要抛弃它。现在可以了吗?现在应该可以了。。事实上,我做任何事都是那样的。。使用vboVertID和vboNormID等绑定顶点法线。。但并不是每一种方法都有效。。通过分析这段代码给我一些建议

    void RenderTringularModel(GLvoid){
if(VertNormals && !MESH_SMOOTH)
{
    glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);

    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
更新3:

我不知道是谁告诉我使用BUFFER_OFFSET()。。。胡说八道。。我现在已经修好了,没有这个愚蠢的缓冲区偏移量,现在工作得很好()。。 现在,修复代码非常简单,如下所示:

void InitVBO(){
glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, p_VERTICES, GL_DYNAMIC_DRAW);

glGenBuffers(1, &vboNormID);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, VertNormals, GL_DYNAMIC_DRAW);

glGenBuffers(1, &indexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}


void RenderTringularModel(GLpoint *P, GLpoint *Vn, GLFace *T, int nbF){
glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, 0);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glPopClientAttrib();}
现在请各位指导我如何实时更新这些缓冲区。我的意思是说我需要实时更新整个数据,法线,顶点,三角形。
例如:细分三角形后,我还需要用顶点和法线更新三角形缓冲区。。另一件事是,在模型的切割模拟过程中,我需要更新顶点的位置和法线,所以我也需要在那个点更新缓冲区。。那么,告诉我该怎么处理这类问题?我怎样才能弥补?是否需要删除缓冲区并重新生成?如果是,那么如何绑定?

您同时将两个对象绑定到同一个目标,并且仅在绑定之后使用glXXXPointer调用。第一件事不再是束缚。按类型对电话进行分组似乎很好,但你不能——你必须按“他们正在做的事情”对他们进行分组。另外,当您使用单独的缓冲区时,为什么会出现偏移和跨步呢?我想您是在谈论InitVBO();好了,现在将顶点和法线放在同一个VBO中。。但是它太小了。它必须是原来的两倍大。不要在init中指定glXPointer。。只需在绘图中进行,然后不要使用偏移量12(这是opengl.org上的示例,对吗?),因为它没有偏移量12,所以它的偏移量为
sizeof(GLpoint)*nb_顶点
。对于您最近的编辑,这确实是一个新问题。您可以只覆盖数据(请参见glBufferData、glBufferSubData或gl(Un)MapBuffer),但新数据显然必须与缓冲区大小相同或更小。如果它必须增长,请删除它并创建一个新的。我刚刚意识到我在这方面很不清楚-glBufferData带有
数据的空指针
删除旧数据并提供新大小的新缓冲区。没有必要去做。
void InitVBO(){
glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, p_VERTICES, GL_DYNAMIC_DRAW);

glGenBuffers(1, &vboNormID);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, VertNormals, GL_DYNAMIC_DRAW);

glGenBuffers(1, &indexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}


void RenderTringularModel(GLpoint *P, GLpoint *Vn, GLFace *T, int nbF){
glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, 0);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glPopClientAttrib();}