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
Opengl 使用几何体着色器进行实例化_Opengl_Graphics_Directx_Shader_Geometry Shader - Fatal编程技术网

Opengl 使用几何体着色器进行实例化

Opengl 使用几何体着色器进行实例化,opengl,graphics,directx,shader,geometry-shader,Opengl,Graphics,Directx,Shader,Geometry Shader,所以我想画很多四边形(甚至立方体),偶然发现了一个叫做几何体着色器的可爱的东西 我现在有点了解它是如何工作的,我可能可以将它简化为顶点缓冲区中每个顶点的立方体,但我不确定这样做是否正确。几何体着色器发生在顶点着色器和片段着色器之间,因此它作用于屏幕空间中的顶点。但我需要它们在世界空间中进行转换 那么,让我的顶点着色器简单地将输入传输到几何体着色器,并在创建基本体后让几何体着色器与modelviewproj矩阵相乘,可以吗?统一着色器体系结构应该没有问题,但当顶点着色器变得多余时,我仍然感到不舒服

所以我想画很多四边形(甚至立方体),偶然发现了一个叫做几何体着色器的可爱的东西

我现在有点了解它是如何工作的,我可能可以将它简化为顶点缓冲区中每个顶点的立方体,但我不确定这样做是否正确。几何体着色器发生在顶点着色器和片段着色器之间,因此它作用于屏幕空间中的顶点。但我需要它们在世界空间中进行转换

那么,让我的顶点着色器简单地将输入传输到几何体着色器,并在创建基本体后让几何体着色器与modelviewproj矩阵相乘,可以吗?统一着色器体系结构应该没有问题,但当顶点着色器变得多余时,我仍然感到不舒服

还有其他选择吗?或者这真的是一种“正确”的方式吗?

完全可以

除此之外,考虑使用实例渲染(<代码> GLD),使用顶点属性除数(<代码> GLVEXTATABRITBIDENROR < /代码>)。这样,您就可以在根本不使用几何体着色器的情况下完成相同的任务

例如,可以绑定常规立方体几何体。然后,您有一个特殊的顶点属性,其中包含每个实例所需的立方体位置。你应该用一个除数=1来绑定它,这将使它在绘制每个实例时前进。然后使用
glDraw*Instanced
绘制立方体,指定实例数


您还可以使用
gl\u VertexID
gl\u InstanceID
获取坐标,从纹理中采样输入数据。

感谢有关实例化的提示,但速度很慢。它将我限制为整个立方体,因此我无法剔除任何隐藏面,而每个四边形的实例化是毫无意义的,因为描述每个四边形变换的4x4矩阵几乎比直接使用4个顶点更大。从性能角度看,哪种方法更快?几何体着色器还是实例?也大约是多少?