OpenGL退化的GL_TRIANGLES共享相同的顶点
OpenGL degenerate GL_TRIANGLES sharing same vertices
我通过glDrawElements()
向GPU发送一个GL_TRIANGLES
的VertexBuffer+IndexBuffer。
在顶点着色器中,我想将一些顶点捕捉到相同的坐标,以在运行中简化大型网格。结果,我得到了很大的性能提升,因为很多三角形都会塌陷到同一点,然后退化。但我没有获得任何fps增益。
由于测试,我将顶点着色器设置为gl_Position(vec4(0))
,以退化所有三角形,但仍然没有区别。。。
有没有任何标志可以"激活"退化,或者我缺少什么?
GL_PRIMITIVES_GENERATED
的glQuery
也总是打印所有网格面的数量。
您缺少的是您尝试使用的优化的实际工作方式。
您正在讨论的特定优化是T&L.也就是说,如果同一个顶点要处理两次,你只处理一次,然后使用两次结果。
你不明白的是"同一个顶点"实际上是如何确定的。它不是由顶点着色器可以计算的任何东西决定的。为什么?缓存的全部目的是避免运行顶点着色器。如果顶点着色器用于确定该值是否已缓存。。。您没有保存任何东西,因为您必须重新计算来确定这一点。
"同一个顶点"实际上是通过匹配顶点索引和顶点实例来确定的。顶点数组中的每个顶点都有一个唯一的索引。如果您使用相同的索引两次(当然只有索引渲染才可能),则顶点着色器将接收相同的输入数据。因此,它将产生相同的输出数据。因此,您可以使用缓存的输出数据。
实例id也起到了作用,因为在进行实例化渲染时,相同的顶点索引并不一定意味着VS的输入相同。但即使如此,如果您获得相同的顶点指数和相同的实例id,那么您也会获得相同的VS输入,因此也会获得同样的VS输出。因此,在一个实例中,相同的顶点索引表示相同的值。
实例计数和顶点索引都是渲染过程的一部分。它们不是来自顶点着色器可以计算的任何东西。顶点着色器可以生成相同的位置、法线或其他任何东西,但实际的变换后缓存基于顶点索引和实例。
因此,如果您想"将一些顶点捕捉到相同的坐标以简化大型网格",则必须在执行渲染命令之前执行。如果你想在着色器中"动态"执行,那么你需要某种计算着色器或几何体着色器/变换反馈过程来计算新网格。然后需要渲染这个新网格。
可以丢弃几何体着色器中的基本体。但你仍然必须做T&L。另外,使用GS会减慢速度,所以我非常怀疑你这样做会获得多大的性能。
- 如何循环打印顶点结构
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- D3D11-将混合权重和索引传递到顶点着色器
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 为什么我的共享库中存在展开符号
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- OpenGL退化的GL_TRIANGLES共享相同的顶点
- GL顶点数据的QThread数据共享方法