1

所以,假设我有两个顶点缓冲区。一个描述我想要绘制的实际形状,另一个能够影响第一个。

所以,我真正想做的是这样的:

uniform VBO second_one;

void main()
{
  for (int i = 0; i < size_of_array(second_one); ++i)
    Do things with second_one[i] to alter the values
  create the output informations
}

我可能想做的事情可能是重力,即 second_one 中的每个点都尝试将点拖得更靠近它等等,然后在调整点之后,应用矩阵以获得其实际位置。

我真的很惊讶它是可能的,或者接近它的东西。但重点是能够使用第二个 VBO,或者让它成为 vec3 类型的制服,让我可以访问它。

4

1 回答 1

1

对于你想要的,你有三个选择。

  1. 一系列制服。GLSL 让你做uniform vec3 stuff[50];. 并且 GLSL 中的数组有一个.length()方法,所以你可以找出它们有多大。当然,你使用的制服数量是有限制的,但你不应该超过 20-30 件。除此之外,您会真正感受到性能的流失。
  2. 统一缓冲对象。这些可以存储比非块制服更多的数据,但它们仍然有限制。并且存储来自缓冲区对象。但是根据硬件的不同,对它们的访问比对直接制服的访问要慢一些。
  3. 缓冲纹理。这是一种将缓冲区对象附加到纹理的方法。有了这个,您可以从着色器中访问大量内存。但请注意:它们的访问速度并不快。如果您可以使用上述方法之一,请这样做。

请注意,#2 和#3 只能在能够支持 GL 3.x 及更高版本的硬件上找到。所以DX10级的硬件。

于 2012-03-05T17:11:22.190 回答