Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
C++ 渲染多个简单对象的技术_C++_Opengl_Rendering - Fatal编程技术网

C++ 渲染多个简单对象的技术

C++ 渲染多个简单对象的技术,c++,opengl,rendering,C++,Opengl,Rendering,我想渲染数量为10^2到10^3的简单对象。就目前而言,这些对象只是带有颜色和法线的立方体(或12个三角形)。 立方体的高度、宽度和位置各不相同。 这些属性将基于伪随机计算创建 在玩家移动到某个位置之前,属性不会改变。因此,每帧不会发生任何变化,但当到达某个位置时,所有内容都会同时发生变化 所以我现在要做的是: 通过填充3个缓冲区进行初始化:顶点位置、法线和颜色 缓冲区保存场景中所有立方体的所有信息 使用一个glDrawArray()调用将整个缓冲区发送到一个简单的着色器 当到达某个位置时,将

我想渲染数量为10^2到10^3的简单对象。就目前而言,这些对象只是带有颜色和法线的立方体(或12个三角形)。 立方体的高度、宽度和位置各不相同。 这些属性将基于伪随机计算创建

在玩家移动到某个位置之前,属性不会改变。因此,每帧不会发生任何变化,但当到达某个位置时,所有内容都会同时发生变化

所以我现在要做的是:

  • 通过填充3个缓冲区进行初始化:顶点位置、法线和颜色
  • 缓冲区保存场景中所有立方体的所有信息
  • 使用一个glDrawArray()调用将整个缓冲区发送到一个简单的着色器
  • 当到达某个位置时,将重新计算每个对象的所有位置、法线和颜色,并使用glBufferSubData()更新整个缓冲区
就我现在拥有的对象数量而言,缓冲区的更新比预期的要长一点,而且非常明显。我还计划向多维数据集添加更多的属性和细节,这将增加更多的时间

对于我目前正在做的事情,有没有任何渲染技术可以用来缩短更新缓冲区的时间

(我正在使用OpenGL和C++)

编辑

  • 是否有一种方法可以更有效地更新完整的缓冲区
  • 逐步更新缓冲区
  • 我是否可以让缓冲区保存较少的信息(仅每个立方体的中心位置),然后让着色器以某种方式“执行其余操作”

并行化如何?在这个过程中,将在何处使用它,并行化的具体内容是什么?您说过,缓冲区更新需要时间,所以要并行化循环。另外,由于问题中没有任何代码示例,所以我在这里是在黑暗中拍摄的。是的,我跳过了代码,因为我刚刚开始寻找一些通用方法。当我的方向正确时,我可能会提出一个新的更具体的问题。但是好的,我可以给我一个如何开始并行化循环的指针,或者一个简短的想法,这到底意味着什么。在这方面我是个新手。把你的缓冲区划分成“X”块,实例化X个线程。如果您有C++11,请使用
std::thread
std::async
std::thread
执行的函数将在作为参数提供的输入范围内工作。因此,您最终将创建X个线程,这些线程将更新缓冲区的X范围(非重叠)(在线程之间共享)。并行化如何?在过程中,将在何处使用此方法,以及并行化的具体内容是什么?您说过缓冲区更新需要时间,所以并行化循环就是这样做的。另外,由于问题中没有任何代码示例,所以我在这里是在黑暗中拍摄的。是的,我跳过了代码,因为我刚刚开始寻找一些通用方法。当我的方向正确时,我可能会提出一个新的更具体的问题。但是好的,我可以给我一个如何开始并行化循环的指针,或者一个简短的想法,这到底意味着什么。在这方面我是个新手。把你的缓冲区划分成“X”块,实例化X个线程。如果您有C++11,请使用
std::thread
std::async
std::thread
执行的函数将在作为参数提供的输入范围内工作。因此,您将最终创建X个线程,该线程将更新缓冲区的X范围(非重叠)(将在线程之间共享)