为什么在AGAL中我们在createVertexBuffer方法中有一个data32PerVertex,其最大值为64?

时间:2012-08-01 20:23:40

标签: adobe molehill agal

我不明白这64个价值...... 据我所知,我们最多有8个寄存器, 每个大小为128位(4 data32),

所以我们无法访问超过32个data32? 我错了吗 ? 我们可以存储在顶点中的其他32个data32是什么?

由于

2 个答案:

答案 0 :(得分:0)

这与MaxStreamStride的d3d上限值有关,通常为256。 但是说真的,你需要那么多的流数据呢?

答案 1 :(得分:0)

他们有两点需要考虑。

  • 第一个是拥有8个4个data32的寄存器,并不意味着你可以使用32 * data32,因为你会浪费空间来填充。

  • 第二个是大多数时候,在视频游戏中,您看到的图像是使用来自顶点的不同数据的多次传递来渲染的。 因此需要在单个着色器可以处理的每个顶点中放置更多数据。

想象一个愚蠢的场景,你想要渲染每个顶点最多10个骨骼的模型。 (这纯粹是理论上的,闪存有一个硬编码的~200 agal指令限制,顺便说一下,除非你正在模拟一个章鱼,否则完全没用)

在每个顶点,您将拥有大量这样的数据。 这总计为每个顶点3 * 3 + 12 * 2 = 33 data32。

3 data32 for position
3 data32 for normal
3 data32 for tangent
2 data32 for boneData1
2 data32 for boneData2
2 data32 for boneData3
2 data32 for boneData4
2 data32 for boneData5
2 data32 for boneData6
2 data32 for boneData7
2 data32 for boneData8
2 data32 for boneData9
2 data32 for boneData10
2 data32 for texture_uv
2 data32 for lightmap_uv

在典型的deferred着色渲染场景中,您将执行以下操作:

1 - 在纹理中渲染“视图空间法线贴图”。 然后,您将编写一个需要使用的着色器:position,normal,tangent和all bonedata。

因此着色器将使用29 data32。 但是所有寄存器都是满的,因为你需要填充正常和正切的位置 (va0位置,va1正常,va2切线,va3-7骨骼数据)。

你将在va0.w,va1.w和va2.w上浪费空间。

2 - 在纹理中渲染“视图空间深度贴图”。 然后,您将编写一个需要使用的着色器:position和all bonedata。

因此着色器将使用23个数据32。

3 - 在纹理中渲染视图空间漫反射贴图 然后,您将编写一个需要使用的着色器:position,texture_uv和所有骨骼数据。

因此着色器将使用25个数据32。

4 - 渲染视图空间光照贴图 然后,您将编写一个需要使用的着色器:position,lightmap_uv和所有骨骼数据。

因此着色器将使用25个数据32。

5 - 最后复合并做出延迟光照来构建你的最终图像。

已使用所有33个数据32。 没有着色器同时使用超过8个寄存器。