我正在尝试使用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);

如您所见,它们没有任何“静态”数据。

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

问题:

确切地说,我要做的是使用“连续LOD”制作地形。 我使用并发布的代码主要来自Andras Balogh的Ranger Mk2。

我的问题是:当我要渲染三角形带时,三角形的3个点上似乎有一个点,该点不应位于该点。 例如,这就是我在线框模式下得到的-> http://i.stack.imgur.com/lCPqR.jpg

这就是我在点模式下得到的(请注意延伸的列是放置不好的点)-> http://i.stack.imgur.com/CF04p.jpg

在您要求我转到“使用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函数):

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

vertex_array = (v4f*)(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
index_array  = (u32*)(glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY));

//[...] Populate the buffers

glUnmapBuffer(GL_ARRAY_BUFFER);
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);

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

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();

奇怪的是它可以工作(虽然部分三角形没有渲染,但这是另一个问题)。

所以我的问题是如何使glDrawRangeElements功能正常?

如果您需要更多信息,请询问,我将很乐意回答。

编辑:我使用Qt Creator作为IDE,在Windows 7上使用Mingw 4.8。我的图形卡支持Opengl 4.4(来自Nvidia)。

===============>>#1 票数:3 已采纳

不知道这是否引起您的问题,但我注意到您对内置顶点属性和通用顶点属性混合了API调用。

诸如glVertexAttribPointerglEnableVertexAttribArrayglDisableVertexAttribArray类的调用用于通用顶点属性。

诸如glVertexPointerglEnableClientStateglDisableClientState类的调用用于内置顶点属性。

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

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

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

  ask by us3r translate from so

未解决问题?本站智能推荐:

1回复

使用glDrawRangeElements()渲染无法正常工作

这是我先前问题的跟进。 我的所有问题都在上一个线程中得到了回答,但这是我遇到的一个新错误。 在中间模式下渲染时,一切看起来都很不错。 实际上: http : //i.imgur.com/OFV6i.png 现在,我使用glDrawRangeElements()进行渲染,看看会发生
1回复

OpenGL-使用GL_TRIANGLE_STRIP从OBJ绘制索引

我试图创建一个OBJ解析器,该解析器将读取OBJ文件并使用GL_TRIANGLE_STRIP对其进行渲染。 我知道OBJ文件的行为类似于TRIANGLES,这就是为什么当我阅读面孔时,我将它们重新排列为STRIPS。 例子我有这样的脸 由于OBJ文件是基于1的索引,因此在将它们重
1回复

IBO比GL_TRIANGLE_STRIP差吗?

出于学习目的,我决定使用3种方法绘制球体 显示列表 Voa Vbo(GL_TRIANGLE_STRIPE) Vao Vbo和Ibo(GL_TRIANGLES) 我读到使用ibo让程序运行得更快,但这是真的吗? 对于100个切片和100个堆栈的球体,第二个方法产
1回复

将GL_TRIANGLE_STRIP显示为线框

我正在努力让一个opengl三角形条带显示为线框。 我的显示算法看起来像这样: 基本上,我正在做的是启动gl_triangle_strip,然后绘制我的高度域对象中每个点的x,y,z坐标。 基本上这是一个大的白色斑点,我试图只显示不同点的线框。 有没有人对如何做到这一点有任何想
2回复

OpenGL:跳过GL_TRIANGLE_STRIP中的每n个四边形

我目前正在用以下方法绘制一条漫长的道路: 我将控制点传递给vbo,如下所示: 以下图为例。 我现有的代码成功地将所有四边形绘制在一起形成一条路径。 但是我想要实现的是绘制一个四边形,然后依次跳过一个。 即画三角形[v0,v1,v2]和[v2,v1,v3]。 跳过[v2,v
1回复

使用GL_TRIANGLE_STRIP或索引GL_TRIANGLES绘制动态数量的四边形是否更有效

我正在用C ++开发一个简单的基于精灵的2D游戏,它使用OpenGL进行硬件加速渲染,使用SDL进行窗口管理和用户输入处理。 由于它是2D游戏,我只需要绘制四边形,但由于精灵的数量是动态的,我永远不能依赖于有恒定数量的四边形。 因此,我需要每帧通过我的VBO重新缓冲所有顶点数据(因为可能有比
1回复

是否可以使用G_TRIANGLE_FAN或GL_TRIANGLE_STRIP绘制两个单独的四边形?

可能吗? 如果我有2个四边形有8个顶点且具有单独的位置(基于四边形),是否可以通过一次调用glDrawElement绘制该四边形的两个?
1回复

使用单个GL_TRIANGLE_STRIP绘制A

这可能吗? (我知道是的,但是我做不到。) 尽管我的下一个想法是桥接A的腿,但我还是在尝试。但是我想在一个条带中完成。
1回复

glPushName()和GL_TRIANGLE_STRIP

我试图在地形中选择一个节点(由三角形条表示)。 但是我不能在glBegin / glEnd之间使用glPushName(),所以我只能将整个条带保存在名称缓冲区中。 任何其他想法如何用鼠标选择特定的节点/三角形? 我知道通过创建GL_TRIANGLE对象而不是三角形条带可以解决我的问题
2回复

为什么三角形条带中使用的z坐标打开gl

我刚刚开始使用openGL,我正在从一本书中自学。 在我的书中,我被告知要使用三角形条来构建四边形,因为它更有效。 本书使用这些顶点来创建四边形。 我不明白为什么z轴不是常数,看起来z轴应该保持不变,y轴应该改变,使得方形显示在2d。 我不明白为什么使用z轴。 这是代码的其余