如何在金属中绑定阵列纹理2D

时间:2018-12-17 00:13:52

标签: ios swift metal

我试图通过遵循我可以从互联网上挖掘出来的内容来尝试在金属中使用二维阵列纹理。我可以成功初始化纹理数组,但是现在遇到一个错误,该错误在将纹理与myEncoder.setFragmentTexture(myTextureArray, index: myIndex)绑定后显示:

Failed assertion `Fragment Function(basicFragment): incorrect type of
texture (MTLTextureType2DArray) bound at texture binding at index 0
(expect MTLTextureType2D) for texture[0].

不知道我在这里做错了什么,不幸的是Google也没有。我想我需要调用一个特定的函数来绑定数组纹理,而不是用来绑定普通纹理(setFragmentTexture的函数),或者我可能在其他地方神秘地将纹理类型设置为单一2D纹理,并且不允许要设置的纹理数组?所以我的问题是:

如何在Metal中正确绑定我的纹理数组?

编辑:

我的片段着色器:

fragment float4 basicFragment(VertexOut vertexOut [[ stage_in ]],
                              texture2d<float> texture [[ texture(0) ]],
                              sampler sampler2D [[ sampler(0) ]])
{
    return texture.sample(sampler2D, vertexOut.texCoord, vertexOut.slice);
}

1 个答案:

答案 0 :(得分:1)

根据Metal Shading Language Specification,在第26页:

以下示例将访问限定符与纹理对象参数一起使用。

void foo (texture2d<float> imgA [[texture(0)]],
         texture2d<float, access::read> imgB [[texture(1)]],
         texture2d<float, access::write> imgC [[texture(2)]])

在上一页中,它们显示您将texture2d<type, access>用于texture2d_array<type, access>纹理数组,而不是使用2D。所以我认为这将是这样的:

void basicFragment(texture2d_array<float> imgA [[texture(0)]],...

例如。