Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 如何在没有性能问题的情况下渲染大对象_Opengl - Fatal编程技术网

Opengl 如何在没有性能问题的情况下渲染大对象

Opengl 如何在没有性能问题的情况下渲染大对象,opengl,Opengl,我有两个对象,每帧渲染一次,其中一个渲染速度快,每帧更新一次,另一个渲染速度慢,使用实例化渲染的大对象。由于我不能在两个不同的线程中使用opengl,因此每次更新大对象时,我都会调用glBufferData并用新数据重置其缓冲区,程序会延迟,灯光对象停止渲染。我设想一种解决方案是每帧渲染一部分重对象,而不是一次渲染所有重对象。但是这个划分不是很实用,所以有更好的方法吗?由于您没有包含代码或描述细节,我将尽我所能理解它。如果您的大型模型是静态且不变的,则最好创建一个VBO顶点缓冲区对象并指定一次数

我有两个对象,每帧渲染一次,其中一个渲染速度快,每帧更新一次,另一个渲染速度慢,使用实例化渲染的大对象。由于我不能在两个不同的线程中使用opengl,因此每次更新大对象时,我都会调用glBufferData并用新数据重置其缓冲区,程序会延迟,灯光对象停止渲染。我设想一种解决方案是每帧渲染一部分重对象,而不是一次渲染所有重对象。但是这个划分不是很实用,所以有更好的方法吗?

由于您没有包含代码或描述细节,我将尽我所能理解它。如果您的大型模型是静态且不变的,则最好创建一个VBO顶点缓冲区对象并指定一次数据,然后使用提供的句柄进行渲染,请阅读此处的详细信息

然而,从你的轮廓来看,我相信你的大模型每一帧都会修改顶点。此外,我相信您的意思是每帧使用glBufferData更新GPU端的顶点/索引数据

更有效的方法是映射索引/顶点缓冲区,只修改需要更改的内容,而不是每帧重置数据

C++

为此,映射缓冲区并获得CPU端的只写缓冲区

void* result = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY)
然后,您可以写入需要更改的值。完成此操作后,只需释放指针进行更新

glUnmapBuffer(GL_ARRAY_BUFFER);
可以将void*强制转换为顶点数据结构,然后将其修改为顶点数据数组。比如,

m_Buffer = (VertexData*)result;
另外,请注意,glMapBuffer将等待GPU完成缓冲区的使用。如果不需要同步写入,则使用glMapBufferRange

以下是此方法的说明、说明和教程。阅读它们并充分理解正在发生的事情将是有益的

glMapBuffer:

glMapBufferRange:

缓冲区映射:


缓冲区流:

因为我不能在两个不同的线程中使用opengl哦?为什么不呢?我到处都看到人们说这很糟糕:还有,有可能同时激活两个opengl上下文吗?这将有助于添加一个更具体的例子来说明您所面临的问题。
void* result = glMapBufferRange(GL_ARRAY_BUFFER, 0, getSize(), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_RANGE_BIT)