如何在金属中使用一系列纹理



我想在金属着色器中使用纹理数组,但它崩溃了 运行我的应用程序(iPhone6,A8(时,这是错误日志:Failed to created pipeline state, error Error Domain=AGXMetalA8 Code=3 "Could not resolve texture/sampler references" UserInfo={NSLocalizedDescription=Could not resolve texture/sampler references}

我尝试谷歌但没有找到有用的信息,任何人都可以给我一些建议,谢谢。

这是我的代码:

fragment float4 fragment_texture (ShaderInput vert [[stage_in]],
array<texture2d<float>, 2> u_texture [[texture(0)]],
sampler _mtlsmp_u_texture [[sampler(0)]])
{
float4 srcColor = u_texture[0].sample(_mtlsmp_u_texture, vert.v_texCoord);
float4 materialColor = u_texture[1].sample(_mtlsmp_u_texture, vert.v_texCoord);
float4 mixColor = mix(srcColor, materialColor, 0.5);
return mixColor;
}

在我的应用代码中:

[renderEncoder setFragmentTexture:_textureDemo
atIndex:0];
[renderEncoder setFragmentTexture:_textureBlend
atIndex:1];
[renderEncoder setFragmentSamplerState:_sampler atIndex:0];

更新问题

我尝试使用参数缓冲区来处理纹理数组,但仍然在装有iOS 6版本的iPhone上崩溃了11.4,并得到相同的错误信息:Failed to create pipeline state, error Could not resolve texture/sampler references

以下是一些关键步骤:

在我的应用程序代码中,argumentEncoder是一个 MTLArgumentEncoder 类型的对象,我通过调用 setTexture:atIndex 将纹理资源编码到参数缓冲区中:

[argumentEncoder setArgumentBuffer:_fragmentShaderArgumentBuffer offset:0];
[argumentEncoder setTexture:_texture[0] atIndex:0];
[argumentEncoder setTexture:_texture[1] atIndex:1];

调用 useResource:usage: 使纹理资源可供 GPU 访问的方法:

[renderEncoder useResource:_texture[0] usage:MTLResourceUsageSample];
[renderEncoder useResource:_texture[1] usage:MTLResourceUsageSample];

并将参数缓冲区_fragmentShaderArgumentBuffer设置为片段函数的参数:

[renderEncoder setFragmentBuffer:_fragmentShaderArgumentBuffer
offset:0
atIndex:0];

在我的片段着色器中:

typedef struct FragmentShaderArguments {
array<texture2d<float>, 2> exampleTextures  [[ id(0)  ]];
} FragmentShaderArguments;
fragment float4
fragmentShader(       RasterizerData            in                 [[ stage_in ]],
device FragmentShaderArguments & fragmentShaderArgs [[ buffer(0) ]])
{
constexpr sampler textureSampler (mag_filter::linear,
min_filter::linear);
float4 color = float4(0, 0, 0, 1);
float4 color1 = fragmentShaderArgs.exampleTextures[0].sample(textureSampler, in.texCoord);
float4 color2 = fragmentShaderArgs.exampleTextures[1].sample(textureSampler, in.texCoord);
color = mix(color1, color2, 0.5);
return color;
}

真诚希望有人能为我提供想法,谢谢!

我升级到iOS 12.0.1,效果很好。

最新更新