如何在HLSL中实现数组零初始化?C语言写法是否适用?
HLSL数组零初始化的正确方式
在HLSL里,float arr[32] = { 0 };这种C语言式的写法没法完成整个数组的零初始化——它只会把数组的第一个元素设为0,剩下的31个元素会是未初始化的垃圾值,和C语言的行为不一样。
要实现HLSL数组的零初始化,分两种场景处理:
- 全局作用域数组:HLSL会自动把全局数组初始化为0,直接声明即可:
float arr[32]; // 全局数组默认全零 - 局部作用域(比如函数内部)数组:
- 用循环逐个赋值,简单直接:
void main() { float arr[32]; for (int i = 0; i < 32; i++) { arr[i] = 0.0f; } } - 用
memset函数快速填充(多数HLSL编译器支持):void main() { float arr[32]; memset(arr, 0, sizeof(arr)); }
- 用循环逐个赋值,简单直接:
当然你也可以在声明时把32个元素全写成0.0f,但这种方式过于繁琐,完全没必要。
内容的提问来源于stack exchange,提问作者Zhe Chen
相关产品推荐
相关产品推荐

