ios - MSL - 如何在金属着色器中指定统一的数组参数?
问题描述
我正在尝试将统一数组传递给金属着色器,例如:
fragment vec4 fragment_func(constant float4& colors[3] [[buffer(0)]], ...) {...}
我收到错误:
"NSLocalizedDescription" : "Compilation failed: \n\nprogram_source:2:1917: error: 'colors' declared as array of references of type 'const constant float4 &'\nprogram_source:2:1923:
error: 'buffer' attribute cannot be applied to types\nprogram_source:2:1961:
我知道“缓冲区”属性只能应用于指针和引用。在那种情况下,在 MSL 中传入统一数组的正确方法是什么?
编辑: MSL 规范声明缓冲区属性支持“缓冲区类型数组”。我一定是在做一些语法错误的事情吗?
解决方案
C++ 中不允许引用数组,MSL 也不支持将它们作为扩展。
但是,您可以获取指向数组中包含的类型的指针:
fragment vec4 fragment_func(constant float4 *colors [[buffer(0)]], ...) {...}
如有必要,您可以将数组的大小作为另一个缓冲区参数传递,或者您可以确保您的着色器函数不会读取比缓冲区中存在的元素更多的元素。
访问元素就像普通的取消引用一样简单:
float4 color0 = *colors; // or, more likely:
float4 color2 = colors[2];
推荐阅读
- kubernetes - Kubernetes API 服务器无法启动:找不到 api-server(master-host) 主机
- reactjs - 在reactjs中使用自定义弹出窗口检测用户离开页面
- python - 使用没有熊猫的python过滤csv数据
- mysql - 在 DocumentSnapshot 中颤振没有方法`get`
- javascript - 在 Google Maps API 中调用本地 GeoJSON 文件时出错
- javascript - 无法回显 .load 函数
- android - 如何在 Xamarin Android 中声明全局变量或常量?
- python - 如何更改flask-ckeditor的CKEditorField的宽度和高度?
- sql - 当我每天有多条记录时填补 SQL 中的空白
- python - 无法从奇怪的 json 内容中获取项目