0

我希望有人可以对我的 agal 问题有所了解:

我有一个 64x64 固定大小的纹理。uv 和顶点也是固定的。

现在我需要在 2D 阶段移动它。

我目前使用的方法是每次从这个纹理中绘制三角形时计算和上传一个新顶点。

我发现 VertexBuffer3D.uploadFromByteArray 需要大量时间来处理。

我相信在 agal 中必须有更聪明的方法来做到这一点。

我可以在顶点阴影的常量寄存器中传递 x、y 偏移量,并在 agal 中计算顶点大小吗?

如果这是可能的,我该怎么做?

4

2 回答 2

2

上传一次几何图形,然后将每个顶点乘以顶点着色器中的模型-视图-透视矩阵。矩阵可以传递给常量寄存器中的顶点着色器(注意一个 4x4 矩阵需要 4 个常量寄存器)。这是一个很好的例子

于 2012-11-22T09:41:28.267 回答
0

如果 MVP 矩阵不足并且您需要操纵单个顶点位置,则可以使用常量寄存器索引。但是请注意,可以以这种方式处理的顶点数量是有限的,因为可用于顶点着色器的常量寄存器的数量是有限的(最多 128 个常量,包括您的 MVP 矩阵)。

  1. 在构建几何图形时,为每个顶点分配一个唯一的 id 并将其上传到顶点数据。最小的 id 应该等于用于存储偏移量的第一个常量的索引。让我们假设这个最小的 id 是n0并且 id 存储在register的x组件中。va1此外,由于 AGAL 没有与 PixelBender 的操作码等效的loadFloat操作码,因此最好为每个顶点设置一些初始位置。让它存储在va0.
  2. 每次渲染场景时,设置常量n0...(n0 + m - 1),其中m是顶点数。Float2您可以使用数据类型将单个顶点的 x 和 y 位移存储在常量内。使用Float4数据类型,您可以为每个顶点存储两个额外的数字(它可能是颜色/纹理偏移或其他)。也可以使用稍微复杂的着色器将两个后续顶点的 xy 偏移存储在单个常量中。
  3. 在 AGAL 中,您可以索引顶点着色器的常量寄存器(至少现在只能索引它们)。让我们在着色器中使用此功能来获取特定顶点的数据:

    mov vt1 vc[va1.x] // obtain the offset from constants using vertex id
    add vt1 vt1 va0   // add the offset to the initial position of the vertex
    m44 op vt1 vc0    // multiply with MVP (assuming that it is stored in vc0...vc3)
    

这种方法适用于几种特定情况,但不适用于一般情况。

于 2013-02-10T05:45:57.843 回答