使用金属顶点和片段着色器将 MTLTexture 传递给 SCNProgram

Posted

技术标签:

【中文标题】使用金属顶点和片段着色器将 MTLTexture 传递给 SCNProgram【英文标题】:Pass MTLTexture to SCNProgram with metal vertex and fragment shaders 【发布时间】:2016-11-13 17:23:21 【问题描述】:

我有一组图像,我必须根据顶点随机选择一个图像,使用金属我可以实现这个 MTLTexture2DArray。

但我使用的是 SceneKit 和自定义 SCNProgram,问题是我无法将 MTLTexture 传递给 Metal 片段函数。

如果我将图像设置为 SCNMaterial 它可以工作,如果我设置金属纹理它会抛出异常。

let material = SCNMaterial()
material.program = program
material.setValue(metalTexture, forKey: "customTexture")

问题和这个问题完全一样 Passing Metal texture2d_array to SceneKit shader modifier

但它使用着色器修改器,这里我使用自定义着色器。

是否可以将金属的 texture2d 数组传递给自定义 SCNProgram,或者是否有另一种方法可以将图像数组传递给 SCNProgram 中的着色器函数?

【问题讨论】:

【参考方案1】:

将金属纹理包裹在SCNMaterialProperty 对象中会起作用。

let imageProperty = SCNMaterialProperty(contents: metalTexture)
material.setValue(imageProperty, forKey: "customTexture")

【讨论】:

非常有用,也适用于立方体贴图纹理

以上是关于使用金属顶点和片段着色器将 MTLTexture 传递给 SCNProgram的主要内容,如果未能解决你的问题,请参考以下文章

片段着色器中的OpenGL点精灵旋转

着色器将 uint8 转换为浮动,并将其重新解释回 uint

损坏的顶点和片段着色器

Shader2.0的顶点着色器和片段着色器

在顶点和片段着色器中访问同名统一失败

片段着色器是不是处理来自顶点着色器的所有像素?