как использовать массив текстур в металле - PullRequest
0 голосов
/ 17 октября 2018

Я хочу использовать массив текстур в металлических шейдерах, но он вылетает при запуске моего приложения (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;
}

Искренне надеюсь, что кто-то может дать мне идеи, спасибо!

1 Ответ

0 голосов
/ 19 октября 2018

Я обновляю до iOS 12.0.1, и она хорошо работает.

...