我希望有人可以对我的 agal 问题有所了解:
我有一个 64x64 固定大小的纹理。uv 和顶点也是固定的。
现在我需要在 2D 阶段移动它。
我目前使用的方法是每次从这个纹理中绘制三角形时计算和上传一个新顶点。
我发现 VertexBuffer3D.uploadFromByteArray 需要大量时间来处理。
我相信在 agal 中必须有更聪明的方法来做到这一点。
我可以在顶点阴影的常量寄存器中传递 x、y 偏移量,并在 agal 中计算顶点大小吗?
如果这是可能的,我该怎么做?
我希望有人可以对我的 agal 问题有所了解:
我有一个 64x64 固定大小的纹理。uv 和顶点也是固定的。
现在我需要在 2D 阶段移动它。
我目前使用的方法是每次从这个纹理中绘制三角形时计算和上传一个新顶点。
我发现 VertexBuffer3D.uploadFromByteArray 需要大量时间来处理。
我相信在 agal 中必须有更聪明的方法来做到这一点。
我可以在顶点阴影的常量寄存器中传递 x、y 偏移量,并在 agal 中计算顶点大小吗?
如果这是可能的,我该怎么做?
上传一次几何图形,然后将每个顶点乘以顶点着色器中的模型-视图-透视矩阵。矩阵可以传递给常量寄存器中的顶点着色器(注意一个 4x4 矩阵需要 4 个常量寄存器)。这是一个很好的例子。
如果 MVP 矩阵不足并且您需要操纵单个顶点位置,则可以使用常量寄存器索引。但是请注意,可以以这种方式处理的顶点数量是有限的,因为可用于顶点着色器的常量寄存器的数量是有限的(最多 128 个常量,包括您的 MVP 矩阵)。
n0并且 id 存储在register的x组件中。va1此外,由于 AGAL 没有与 PixelBender 的操作码等效的loadFloat操作码,因此最好为每个顶点设置一些初始位置。让它存储在va0.n0...(n0 + m - 1),其中m是顶点数。Float2您可以使用数据类型将单个顶点的 x 和 y 位移存储在常量内。使用Float4数据类型,您可以为每个顶点存储两个额外的数字(它可能是颜色/纹理偏移或其他)。也可以使用稍微复杂的着色器将两个后续顶点的 xy 偏移存储在单个常量中。在 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)
这种方法适用于几种特定情况,但不适用于一般情况。