HLSL 中的数组长度?

Spe*_*ump 3 shader loops hlsl

我找不到任何有关如何在 HLSL 中获取数组长度的文档或示例。

我将一组灯光推送到 hlsl 着色器,并且我想做一个for(int i=0; i<foo.length; i++)(-不是正确的语法)。

难道不能获取数组的长度吗?我必须从 C++ 端将数组长度整数推送到 hlsl 着色器吗?

此外,如何找出着色器中允许的最大 for 循环计数是多少?(由于循环是展开的,所以应该有一个限制。)

Gni*_*how 5

据我所知,您必须声明具有预定义长度的数组(数组语法需要一个正整数作为大小)。如果您现在用任意数量的数据从 extern 填充这个固定数组,HLSL 无法知道这一点。因此,您需要将数组长度传递给着色器。

如果您使用着色器模型 3.0+ 并且[unroll]之前未指定,则循环不会自动展开。(文档

当未指定属性时,编译器将首先尝试发出循环的滚动版本,如果失败,或者如果展开循环某些操作会更容易,则将回退到循环的展开版本。

因此,没有最大允许的循环计数,但根据您使用的着色器模型,存在最大执行指令计数(wiki),此外,如果渲染需要超过 2 秒,Windows 的看门狗会重置您的图形设备(doc),例如无限循环。