Actionscript 3 AGAL帮助:在2D纹理、2D渲染中,如何使用AGAL计算顶点相对于程序常量的x、y偏移量

Actionscript 3 AGAL帮助:在2D纹理、2D渲染中,如何使用AGAL计算顶点相对于程序常量的x、y偏移量,actionscript-3,stage3d,agal,Actionscript 3,Stage3d,Agal,我希望有人能解释一下我的问题: 我有一个64x64固定大小的纹理。uv和顶点也是固定的 现在我需要在2D舞台上移动它 当前我使用的方法是每次从该纹理绘制三角形时计算并上传一个新顶点 我发现VertexBuffer3D.uploadFromByteArray需要花费大量时间来处理 我相信在阿加尔一定有更聪明的方法来做到这一点 我可以在顶点着色的常量寄存器中传递x,y偏移,并在agal中计算顶点大小吗 如果这是可能的,我该怎么做?将几何体上载一次,然后在顶点着色器中将每个顶点与模型视图透视矩阵相乘。

我希望有人能解释一下我的问题:

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

现在我需要在2D舞台上移动它

当前我使用的方法是每次从该纹理绘制三角形时计算并上传一个新顶点

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

我相信在阿加尔一定有更聪明的方法来做到这一点

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


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

将几何体上载一次,然后在顶点着色器中将每个顶点与模型视图透视矩阵相乘。该矩阵可以传递到常量寄存器中的顶点着色器(请注意,一个4x4矩阵需要4个常量寄存器)。如果MVP矩阵不足,您需要操纵各个顶点位置,则可以使用常量寄存器索引。但请注意,可以以这种方式处理的顶点数量是有限的,因为顶点着色器可用的常量寄存器数量是有限的(包括MVP矩阵在内的最多128个常量)

  • 构建几何体时,为每个顶点指定一个唯一的id,并将其上载到顶点数据。最小id应等于用于存储偏移的第一个常量的索引。让我们假设这个最小的id是
    n0
    ,并且id存储在
    va1
    寄存器的
    x
    组件中。此外,由于AGAL没有与PixelBender的
    loadFloat
    opcode等效的操作码,因此最好为每个顶点设置一些初始位置。将其存储在
    va0
  • 每次渲染场景时,设置常量
    n0…(n0+m-1)
    ,其中
    m
    是顶点数。可以使用
    Float2
    数据类型将单个顶点的x和y位移存储在常量中。使用
    Float4
    数据类型,可以为每个顶点存储两个额外的数字(可以是颜色/纹理偏移或smth其他)。也可以使用稍微复杂的着色器将两个后续顶点的x-y偏移存储在单个常量中
  • 在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)
    

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

    请关闭此选项。有一个答案,这是一个有效的回答。@jordancpaul然而,我添加了另一种方法的示例,在某些情况下可能也很有用。