C++ GLDRawRange GL_三角形_条的元素工作不正常(使用glMapBuffer)

C++ GLDRawRange GL_三角形_条的元素工作不正常(使用glMapBuffer),c++,opengl,C++,Opengl,我正在尝试使用glDrawRangeElements从VBO和元素缓冲区对象渲染点 VBO和EBO的实例如下所示: glGenBuffers(1, &vertex_buffer); glGenBuffers(1, &index_buffer); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, NULL,

我正在尝试使用glDrawRangeElements从VBO和元素缓冲区对象渲染点

VBO和EBO的实例如下所示:

    glGenBuffers(1, &vertex_buffer);
    glGenBuffers(1, &index_buffer);

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, NULL, GL_STREAM_DRAW);
    glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0, (char*)(NULL));
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, NULL, GL_STREAM_DRAW);
glBegin(GL_TRIANGLE_STRIP);
printf("%u %u\n", va_index, ia_index);
for(u32 i = 0; i < va_index; ++i){
    //if(i <= va_index)
        glVertex4fv(&vertex_array[i].x);
}
glEnd();
正如您所见,它们没有任何“静态”数据

我使用glMapBuffer填充缓冲区,然后使用glDrawRangeElements渲染它们

问题:

具体来说,我想做的是制作一个具有连续LOD的地形。 我使用和发布的代码主要来自Andras Balogh的Ranger Mk2

我的问题是:当我想要渲染三角形条带时,三角形的3个点上似乎有一个点,它不应该在某个地方。 例如 这是我在线框模式下得到的->

这就是我在点模式下得到的结果(注意向上延伸的列,这是位置不好的点)->

在您让我转到名为“使用glDrawRangeElements()进行渲染无法正常工作”的帖子之前,我想让您知道我已经到了那里

代码:

下面是渲染过程:

glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(4, GL_FLOAT, 0, 0);
glEnableVertexAttribArray(0);

glDrawRangeElements(GL_TRIANGLE_STRIP, 0, va_index, ia_index, GL_UNSIGNED_INT,  BUFFER_OFFSET(0));

glDisableClientState(GL_VERTEX_ARRAY);
在执行此操作之前(pre_render函数):

PS:当我像这样渲染地形时:

    glGenBuffers(1, &vertex_buffer);
    glGenBuffers(1, &index_buffer);

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, NULL, GL_STREAM_DRAW);
    glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0, (char*)(NULL));
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, NULL, GL_STREAM_DRAW);
glBegin(GL_TRIANGLE_STRIP);
printf("%u %u\n", va_index, ia_index);
for(u32 i = 0; i < va_index; ++i){
    //if(i <= va_index)
        glVertex4fv(&vertex_array[i].x);
}
glEnd();
glBegin(GL\u三角形\u带);
printf(“%u%u\n”,va\u索引,ia\u索引);
对于(u32 i=0;i//if(i不确定这是否导致了您的问题,但我注意到您混合了对内置顶点属性和通用顶点属性的API调用

glVertexAttributePointer
GlenableVertexAttributeArray
glDisableVertexAttributeArray
这样的调用用于通用顶点属性

glvertexinter
glEnableClientState
glDisableClientState
这样的调用用于内置顶点属性

您需要决定要使用哪种方法,然后为该方法使用一组一致的API调用。如果使用固定渲染管道,则需要使用内置属性。如果使用兼容配置文件编写自己的着色器,则可以使用其中一种。如果使用核心配置文件,则需要使用通用顶点属性美国

此调用看起来也很可疑,因为它指定的大小为3,代码的其余部分表明您使用的位置有4个坐标:

glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0, (char*)(NULL));

通用属性0保证别名为
glVertexPointer(…)
,因此可以执行此代码所做的操作,只是在实践中这不是一个特别好的主意。这是否实际工作将取决于使用的顶点着色器。谢谢:D。这是glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,(char*)(NULL));这是错误的。(PS:glVertexPointer,…,我添加它们是因为我想测试一切,看看它是否有任何作用)@AndonM.Coleman:你能给我一个指向规范的指针吗?我以前读过这个声明,但从来都不确定它是否正确。从OpenGL 3.3(兼容性配置文件)规范,第35页底部:“通用属性和常规属性之间没有别名。换句话说,应用程序可以设置所有MAX_VERTEX_ATTRIBS通用属性和所有常规属性,而不用担心某个特定属性会覆盖另一个属性的值。“@RetoKoradi:阅读前面的段落。类似于
glVertexAttrib4fv(0,…)
的命令完全等同于
glVertex4fv(…)
。满足此行为的唯一方法是将属性0别名设置为position。事实上,在我使用过的OpenGL的每个兼容实现中都会观察到此别名。当然,由于在core中删除了立即模式,因此在兼容模式之外不必执行此行为。因为设置属性0会创建new vertex,不可能覆盖任何内容,从而不违反以下段落。@AndonM.Coleman:有趣。这两条语句似乎相互矛盾。我引用的部分表明,可以使用通用属性0,而不覆盖固定属性的值。而你引用的部分则表明它正在执行e确切地说。我也没有发现任何东西表明
glEnableClientState(GL\U VERTEX\U数组)
GlenableClientArray(0)
是等效的。如果混合使用这些调用,我已经看到了供应商实现行为的不同。