Как связать массив текстуры 2D в металле - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь использовать массив текстуры 2D в металле, следуя тому, что я могу найти в Интернете.Я успешно смог инициализировать свой массив текстур, но теперь я застрял с ошибкой, которая появляется после связывания текстуры с 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-текстуру где-то еще и не позволяю текстурумассив для установки?Поэтому мой вопрос:

Как правильно связать массив текстур в металле?

РЕДАКТИРОВАТЬ:

Мой фрагментный шейдер:

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 голосов
/ 17 декабря 2018

В соответствии со спецификацией Metal Shading Language на стр. 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)]],...

например.

...