2013-12-23 83 views
0

我喜欢在顶点着色器中生成平坦的着色三角形标准。为此,我需要访问当前顶点着色器中的两个下一个顶点属性。显然这可以通过几何着色器来完成,但这些不在GL ES中存在。OpenGL重叠顶点属性

那么有什么办法可以让GLSL访问三个连续的顶点位置,但只能在每个顶点调用中前进一个位置?否则,我将不得不将三个顶点的数据分配给每个顶点。

+0

为什么不预先计算正常/颜色,并将其存储在缓冲区以及顶点? – Vallentin

+0

我不喜欢存储所有可以通过三角形顶点位置轻松获得的法线......即使我存储它们,我也只有三个顶点的法线,所以如何访问它们3次?同样的问题... – dronus

回答

0

在顶点着色器中不可能访问多个顶点。如果要创建平面着色,则需要复制顶点,以便为每个需要的曲面法线提供单独的顶点副本(每个面共享该顶点位置一个顶点)。这可能是您需要OpenGL ES的解决方案。

或者,如果您的目标是OpenGL 4.x,则可以使用provoking vertex的概念,该概念允许您指定一个顶点,以便在面的所有顶点上重新使用这些顶点。受影响的属性只是在着色器源代码中与flat关键字相关联的属性。

+0

这并没有解决我的主要问题,我不喜欢正常的顶点数据包含在内。因为如果多于一个顶点可用,它很容易计算,所以我认为它应该是可能的。但是,似乎需要几何着色器。 – dronus

+0

如果使用'glVertexAttribPointer'三次,使用一个太小的'stride'和三个不同的偏移量,则每个绑定属性会给出序列中的不同顶点。但是,为了获得按照基元分组的数据,需要获得一系列五个顶点,并通过我猜想的基元ID选择正确的一个顶点。问题是,如果这得到了优化,或者创建五倍带宽需要一个顶点饲料...当然,它不必这样做... – dronus

+0

我认为你是误解。我建议的解决方案是停止尝试优化缓冲区中顶点的数量。如果您有一个逻辑顶点出现在N个面中,每个面都有不同的曲面法线,那么顶点位置应该出现在您的位置缓冲区N次,其他缓冲区具有相应的颜色/曲面法线/无论在给定的位置指数。 – Jherico