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_Shader_Vbo - Fatal编程技术网

OpenGL顶点属性重用

OpenGL顶点属性重用,opengl,shader,vbo,Opengl,Shader,Vbo,在默认的网格顶点构造中,我们这样做 //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,

在默认的网格顶点构造中,我们这样做

//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) 最佳解决方案


不,他们不是。在您的例子中,顶点是v、p和c的整体组合。改变其中一个,你会得到一个完全不同的顶点。常见的误解,但它就是这样工作的

假设您不是在一个古老的硬件上,并且顶点内存实际上没有那么重要,只需复制数据并保留每个顶点的完整属性集即可。当然不会慢下来


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

这样做的(非常小的)内存好处的性能损失通常是不值得的,没有干净的方法可以做到这一点。对于你加载的大多数模型,你会有很多独特的纹理坐标和法线。这对我来说真的是错误的经济。在担心一些“冗余”数据之前,我更担心GPU的效率。与纹理内存需求相比,这算不了什么。除了(或尽管!)我之前说过的,你可能会发现它有一些用处。你的问题没有意义。位置是顶点的一部分;它是顶点的一个组件。那么,如果不改变位置或颜色,v0和v1的哪个部分是不同的呢。简而言之,你们这里的“顶点”是什么意思?我的意思是:一个三角形有三个点来定义它们的模型。我可以发送3个位置,或3种颜色或任何东西。但正常情况下,三角形的3个点的这3个位置是相同的。我想知道是否有办法减少位置(或颜色等)的重复。当发送一千个三角形时,我会发送三千个点和相同大小的位置、颜色等。如果每个三角形使用一个位置,则会将其剪切2/3。因为我将处理数百万个三角形,所以切割两百万个浮动似乎是个好主意;P
//p and c are the same for all vertexes