Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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/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
C++ OpenGL避免多次调用GLDrawerElements_C++_Opengl_Glsl_Opengl 3 - Fatal编程技术网

C++ OpenGL避免多次调用GLDrawerElements

C++ OpenGL避免多次调用GLDrawerElements,c++,opengl,glsl,opengl-3,C++,Opengl,Glsl,Opengl 3,我正在将我们的图形从使用旧的固定管道功能迁移到使用可编程管道。我们最简单的模型就是空间中的一组点,每个点都可以用不同的形状来表示。其中一个是立方体 我的代码基于OpenGL superbible中的立方体 在这个例子中,立方体被放置在一些随机的地方,而我将在空间中有一个固定的点。我想知道是否有一种方法可以将该列表传递给我的着色器,以便在每个点绘制一个立方体,而不是在列表中循环并每次调用gldrawerelements。这是否值得麻烦(性能方面) PS我们仅限于OpenGL 3.3功能。在您的示例

我正在将我们的图形从使用旧的固定管道功能迁移到使用可编程管道。我们最简单的模型就是空间中的一组点,每个点都可以用不同的形状来表示。其中一个是立方体

我的代码基于OpenGL superbible中的立方体

在这个例子中,立方体被放置在一些随机的地方,而我将在空间中有一个固定的点。我想知道是否有一种方法可以将该列表传递给我的着色器,以便在每个点绘制一个立方体,而不是在列表中循环并每次调用gldrawerelements。这是否值得麻烦(性能方面)


PS我们仅限于OpenGL 3.3功能。

在您的示例中,每个立方体每帧使用自己的模型矩阵。 如果你想保持这种状态,你需要调用多个抽屉元素。
如果某些多维数据集不移动(不需要每帧模型矩阵),则应将这些多维数据集合并到一个VBO中。

在您的示例中,每个多维数据集每帧使用自己的模型矩阵。 如果你想保持这种状态,你需要调用多个抽屉元素。 如果某些多维数据集不移动(不需要每帧模型矩阵),则应将这些多维数据集合并到一个VBO中

这是否值得麻烦(性能方面)

可能是的,但还是试着描述一下

您正在寻找的是实例渲染,请查看和

您要做的是将常规立方体的8个顶点(以原点为中心)存储在一个缓冲区中,并将每个立方体的中心坐标存储在另一个顶点属性缓冲区中

然后,可以使用
glDrawerElementsInstanced
绘制N个立方体,从第一个缓冲区提取顶点,并使用存储在第二个缓冲区中的特定位置在着色器中转换它们

大概是这样的:

glVertexAttribPointer( vertexPositionIndex, /** Blah .. */ );
glVertexAttribPointer( cubePositionIndex, /** Blah .. */ );
glVertexAttribDivisor( cubePositionIndex, 1 ); // Advance one vertex attribute per instance

glDrawElementsInstanced( GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices, NumberOfCubes );
在顶点着色器中,需要两个属性:

 vec3 vertexPosition; // The coordinates of a vertex of the generic cube
 vec3 cubePosition; // The coordinates of the center the specific cube being rendered

 // .... 
 vec3 vertex = vertexPosition + cubePosition;
显然,你也可以用一个缓冲区来存储每个立方体的大小,或者用另一个缓冲区来存储方向,这个想法保持不变

这是否值得麻烦(性能方面)

可能是的,但还是试着描述一下

您正在寻找的是实例渲染,请查看和

您要做的是将常规立方体的8个顶点(以原点为中心)存储在一个缓冲区中,并将每个立方体的中心坐标存储在另一个顶点属性缓冲区中

然后,可以使用
glDrawerElementsInstanced
绘制N个立方体,从第一个缓冲区提取顶点,并使用存储在第二个缓冲区中的特定位置在着色器中转换它们

大概是这样的:

glVertexAttribPointer( vertexPositionIndex, /** Blah .. */ );
glVertexAttribPointer( cubePositionIndex, /** Blah .. */ );
glVertexAttribDivisor( cubePositionIndex, 1 ); // Advance one vertex attribute per instance

glDrawElementsInstanced( GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices, NumberOfCubes );
在顶点着色器中,需要两个属性:

 vec3 vertexPosition; // The coordinates of a vertex of the generic cube
 vec3 cubePosition; // The coordinates of the center the specific cube being rendered

 // .... 
 vec3 vertex = vertexPosition + cubePosition;

显然,您也可以使用一个缓冲区来存储每个立方体的大小,或者使用另一个缓冲区来存储方向,其想法保持不变。

仅在这里说明一下,您还可以使用几何体着色器(自openGL 3.2以来)来生成立方体,但从性能角度来看,这可能不是一个很好的解决方案,尤其是对于大量立方体。有一个稍旧的示例(支持实例化),我们也可以使用几何体着色器(因为openGL 3.2)生成多维数据集,但从性能角度来看,它可能不是一个很好的解决方案,尤其是对于大量的多维数据集。一个稍旧的示例(支持实例化)