AGAL HELP:在2D纹理,2D渲染中,如何使用agal来计算顶点x,y偏离程序常量

时间:2012-11-22 09:06:41

标签: actionscript-3 stage3d agal

我希望有人可以对我的敏捷问题进行一些说明:

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

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

我正在使用的当前方法是每次从此纹理中绘制三角形时计算并上传新顶点。

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

我相信必须有更明智的方法来实现这一目标。

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

如果可以,我该怎么办?

2 个答案:

答案 0 :(得分:2)

上传几何体,然后将每个顶点乘以顶点着色器中的“模型 - 视图 - 透视”矩阵。矩阵可以传递给常量寄存器中的顶点着色器(请注意,一个4x4矩阵需要4个常量寄存器)。 Here`s a nice example这个。

答案 1 :(得分:0)

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

  1. 构建几何体时,为每个顶点指定唯一的ID并将其上传到顶点数据。最小的id应该等于用于存储偏移的第一个常量的索引。假设这个最小的id为n0,并且id存储在x寄存器的va1组件中。此外,由于AGAL没有等效的PixelBender的loadFloat操作码,因此为每个顶点设置一些初始位置会很好。将其存储在va0
  2. 每次渲染场景时,设置常量n0...(n0 + m - 1),其中m是顶点数。您可以使用Float2数据类型将单个顶点的x和y位移存储在常量中。使用Float4数据类型,您可以为每个顶点存储两个额外的数字(可能是颜色/纹理偏移或其他)。也可以使用稍微复杂的着色器将两个结果顶点的x-y偏移存储在一个常量中。
  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)
    
  4. 这种方法适用于几种特定情况,但在一般情况下不适用。