Как прочитать или сэмплировать значение трафарета из глубины / текстуры трафарета? - PullRequest
1 голос
/ 08 апреля 2019

Допустим, у меня есть текстура глубины / трафарета, имеющая формат MTLPixelFormatDepth32Float_Stencil8, которую я использую в качестве вложения на этапе рендеринга, а затем я хочу сэмплировать значения трафарета из этой текстуры на последнем этапе рендеринга.

Спецификация языка

Metal Shading вообще ничего не упоминает об этом, только то, что текстуры глубины должны быть объявлены как depth2d<T, access a = access::sample>, а для depth2d и T sample(sampler s, float2 coord, int2 offset = int2(0)) const, и T read(uint2 coord, uint lod = 0) const возвращаются T, где T наиболее вероятно будет float.

Итак, мой вопрос: как мне прочитать или сэмплировать значения трафарета из этой текстуры?

1 Ответ

2 голосов
/ 08 апреля 2019

Создание вида текстуры трафарета текстуры глубины / трафарета с форматом MTLPixelFormatX32_Stencil8. Затем передайте вид текстуры в шейдер, где вы хотите его прочитать. Он работает как R8Uint текстура.

Обратите внимание, что не все устройства поддерживают виды текстур трафарета. Они поддерживаются для наборов функций, равных или лучше, чем iOS_GPUFamily1_v3, iOS_GPUFamily2_v3, iOS_GPUFamily3_v2, tvOS_GPUFamily1_v2 или OSX_GPUFamily1_v2.

Если это не поддерживается, вам нужно использовать blit-кодер, чтобы скопировать текстуру глубины / трафарета в буфер, а затем либо напрямую использовать этот буфер, либо скопировать его в текстуру подходящего формата.

...