HLSL:未对齐/压缩浮点数的索引

发布于 2024-09-02 03:30:22 字数 463 浏览 10 评论 0原文

我有一个顶点着色器(2.0)做一些实例化 - 每个顶点指定一个数组的索引。

如果我有一个像这样的数组:

float instanceData[100];

编译器为其分配 100 个常量寄存器。每个常量寄存器都是一个 float4,因此它分配的空间是所需空间的 4 倍。

我需要一种方法让它只分配 25 个常量寄存器并在每个寄存器中存储四个值。

理想情况下,我想要一种在 CPU 和 GPU 上看起来仍然像 float[] 的方法(现在我正在调用 EffectParamter.SetValue(Single[]) ,我正在使用 XNA)。但手动打包和解包 float4[] 也是一种选择。

另外:这样做对性能有何影响?它真的值得吗? (对我来说,这将节省大约每四到五个批次)。

I have a vertex shader (2.0) doing some instancing - each vertex specifies an index into an array.

If I have an array like this:

float instanceData[100];

The compiler allocates it 100 constant registers. Each constant register is a float4, so it's allocating 4 times as much space as is needed.

I need a way to make it allocate just 25 constant registers and store four values in each of them.

Ideally I'd like a method where it still looks like a float[] on both the CPU and GPU (Right now I am calling EffectParamter.SetValue(Single[]), I'm using XNA). But manually packing and unpacking a float4[] is an option, too.

Also: what are the performance implications for doing this? Is it actually worth it? (For me, this will save about one batch in every four or five).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

惯饮孤独 2024-09-09 03:30:22

这有帮助吗?:

float4 packedInstanceData[25];
...
float data = packedInstanceData[index / 4][index % 4];

Does that helps?:

float4 packedInstanceData[25];
...
float data = packedInstanceData[index / 4][index % 4];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文