0

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

所以我们不能访问超过 32 个数据 32?我错了吗 ?对于我们可以存储在顶点中的其他 32 个数据 32 是什么?

谢谢

4

3 回答 3

0

这与 MaxStreamStride 的 d3d caps 值有关,通常为 256。但是说真的,你需要这么多流数据做什么?

于 2012-09-14T06:11:14.817 回答
0

他们有两点需要考虑。

  • 第一个是每个有 4 个 data32 的 8 个寄存器并不意味着您可以使用 32 * data32,因为您将浪费空间进行填充。

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

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

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

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

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

1 - 在纹理中渲染“视图空间法线贴图”。然后,您将编写一个需要使用的着色器:位置、法线、切线和所有骨骼数据。

所以着色器将使用 29 个数据 32。但是所有寄存器都会被填满,因为你需要填充位置、法线和切线(va0 位置、va1 法线、va2 切线、va3-7 骨骼数据)。

您将在 va0.w、va1.w 和 va2.w 上浪费空间。

2 - 在纹理中渲染“视图空间深度图”。然后,您将编写一个需要使用的着色器:位置和所有骨骼数据。

所以着色器将使用 23 个 data32。

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

所以着色器将使用 25 个 data32。

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

所以着色器将使用 25 个 data32。

5 - 最后合成并进行延迟照明以构建最终图像。

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

于 2013-04-10T18:42:01.193 回答
0

您可以使用 setVertexBufferAt 和 offset 访问此数据。但你是对的 - 因为只有 8 个寄存器可用,所以不可能使用所有数据。

于 2012-08-02T07:28:17.913 回答