着色器语言能否用引用避免拷贝?GLSL转Slang代码简化问询
在Slang中实现类似C++的引用别名功能
Slang完全支持你需要的引用别名功能,用法和C++几乎一致,完美解决GLSL中只能通过拷贝简化冗长代码的问题。
问题回顾
你在GLSL中遇到的冗长代码问题:
obj_scaling = vec3( object_info_arrays[nonuniformEXT(obj_info_array_idx_zero_or_one)].obj_info_array[obj_index].orientation_and_scaling_and_frac_pos[0].w, object_info_arrays[nonuniformEXT(obj_info_array_idx_zero_or_one)].obj_info_array[obj_index].orientation_and_scaling_and_frac_pos[1].w, object_info_arrays[nonuniformEXT(obj_info_array_idx_zero_or_one)].obj_info_array[obj_index].orientation_and_scaling_and_frac_pos[2].w );
这段代码重复调用object_info_arrays[nonuniformEXT(obj_info_array_idx_zero_or_one)].obj_info_array[obj_index],GLSL没有引用机制,只能创建拷贝来简化,但拷贝可能带来不必要的开销,且并非你想要的"别名"效果。
Slang的解决方案
在Slang中,你可以直接使用C++风格的引用语法来创建别名,不会产生拷贝,只是对原对象的引用:
ObjectInfo& obj_info = object_info_arrays[nonuniformEXT(obj_info_array_idx_zero_or_one)].obj_info_array[obj_index];
之后你就可以用这个别名来简化代码,可读性大幅提升:
obj_scaling = vec3( obj_info.orientation_and_scaling_and_frac_pos[0].w, obj_info.orientation_and_scaling_and_frac_pos[1].w, obj_info.orientation_and_scaling_and_frac_pos[2].w );
补充说明
Slang作为基于HLSL的扩展语言,不仅支持基本的引用语法,还支持对数组元素、嵌套结构体成员等复杂对象的引用,完全满足你简化代码、避免冗余的需求,同时保持和原对象的绑定关系,不会产生额外拷贝开销。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

