Я хочу использовать массив текстур в металлических шейдерах, но он вылетает при запуске моего приложения (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}
Я пытался Google, но ненайти полезную информацию, может кто-нибудь дать мне несколько советов, спасибо.
Вот мой код:
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];
Проблемы с обновлением
Я пытаюсь использовать Буферы аргументов для работы с массивом текстур, но все еще не работает на моем iPhone6 с версией iOS 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: using: для того, чтобы сделать ресурсы текстур доступными для графического процессора:
[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;
}
Искренне надеюсь, что кто-то может дать мне идеи, спасибо!