2013-02-08 106 views
2

在默认的网格顶点构造中,我们执行此操作。OpenGL顶点属性重用

//v = vertex, p = position, c = color 
buffer = { v0 , p0, c0, 
      v1 , p0, c0, 
      v2 , p0, c0 }; 

而且我们有一个三角形。 但我想重用明显的特征是这样的:

//p and c are the same for all vertexes 
buffer = { v0, p0, c0 , 
      v1, 
      v2 }; 

我们可以在着色均匀值做到这一点,但我会渲染数以千计的同一缓冲区不同位置的三角形:

buffer = { v0, p0, c0 , 
      v1, 
      v2, 
      v3, p1, c1, 
      v4, 
      v5, 
      v6, p2, c2, 
      ...}; 

我现在的解决方案是:

1)发送属性的副本像第一个例子中的每个顶点(鸵鸟政策想,但也许是最好的解决方案)。

2)发送用于位置/颜色(统一大小限制问题的索引属性(搜索)和均匀阵列?)

3)最佳解决方案?

+0

这样做(很小)的内存利益的性能损失通常是不值得的,没有干净的方式做到这一点。在加载大多数模型的情况下,您将拥有大多数独特的纹理坐标和法线。 –

+0

对我来说,这看起来像是虚假的经济。在担心一些“冗余”数据之前,我更担心GPU的效率。与纹理内存要求相比,这没什么。 –

+0

除了(或者尽管有!)我之前说过的,你可能会发现[provoking vertex](http://www.opengl.org/wiki/Primitive#Provoking_vertex)有一些用处。 –

回答

3
//p and c are the same for all vertexes 

不,他们不是。在你的情况下,顶点是v,p和c的整个组合。改变其中的一个,并且你有一个完全不同的顶点。常见的误解,但这就是它的工作原理

+0

您是对的,我的意思是'相同的值'。 – Patric

2

假设你不是在一个古老的硬件上,并且顶点内存不是真的那么重要,只需复制数据并保留每个顶点具有一组完整的属性。它肯定不会变慢。

以这种方式“重用”数据通常会导致性能下降,因为GPU无法优化数据访问;它必须做你想要做的复杂事情。

+3

请问下降者请说明原因? –