Массив текстур в металле

fragment half4 fragmen_shader_test(WaterColorCloudOut params[[stage_in]],
                                                         texture2d<float , access::sample>cloud1 [[texture(0)]],
                                                         texture2d<half, access::sample> cloud2 [[texture(1)]],
                                                         texture2d<half, access::sample> cloud3 [[texture(2)]]
                                                         )
{
    constexpr sampler defaultSampler;
    float4 color1;

    if (params.index == 0){
        color1= float4(cloud1.sample(defaultSampler, float2(params.textureCoordinates)))  * params.color ;
    }
    else if (params.index == 1){
        color1= float4(cloud2.sample(defaultSampler, float2(params.textureCoordinates)))  * params.color ;
    } else{
        color1= float4(cloud3.sample(defaultSampler, float2(params.textureCoordinates)))  * params.color ;
    }

 return half4(color1);
}

Здесь я использую три текстуры из-за условия If-else, производительность падает со временем. Я чувствую, что если я отправляю массив текстур в шейдер, нет необходимости выполнять оператор if else. В CPU у меня три MTLTexture. Как я могу привязать три текстуры к массиву и передать ему шейдер.

На стороне процессора я создал три текстуры и создал массив MTLTexture.

 var textureArray:[MTLTexture] = [] 

Затем я добавляю текстуру к этому массиву. В MTLRenderCommandEncoder

let myRange: CountableRange = 0..<2
commandEncoder.setFragmentTextures(textureArray, range: myRange)

В шейдере

texture2d_array<float ,  access::sample> texture [[ texture(0) ]]

При сэмплировании в шейдере

float4 color = texture.sample(defaultSampler, float2(params.textureCoordinates),0) * float4(1,0,0,1.0);

Я делаю это в настоящее время, но я не смог получить правильный вывод текстуры

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 764
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно менять код приложения. Поскольку вы используете последовательные индексы текстур, вы можете просто заменить три отдельных параметра одним параметром массива текстур, привязанным к индексу 0, и привязки будут соединять элементы массива с текстурами, которые вы предоставили из кода приложения.

Другими словами, если вы объявляете массив текстур размером 3 и привязан к индексу текстуры 0, элементы массива берутся из индекса текстуры 0, 1 и 2.


Обновление для вашего отредактированного вопроса:

Вы путаете массив текстур из (также называемый массивом текстур) и массив текстур. Терминология очень тонкая.

  • Текстура массива - это одна текстура с несколькими 2D-плоскостями в ней. Все плоскости имеют одинаковый размер и формат пикселей. Количество плоскостей в текстуре не обязательно знать во время компиляции шейдера.
  • Массив текстур - это массив независимых текстур, которые могут иметь разные размеры или форматы пикселей. Длина массива - это константа времени компиляции.

Вы использовали texture2d_array<...>. Это текстура массива.

Для массива текстур или массива текстур следует использовать array<texture2d<float, access::sample>, 3> clouds [[texture(0)]].

Чтобы выполнить выборку из текстуры в массиве, вы сначала индексируете массив, а затем вызываете функцию текстуры для этого элемента:

float4 color = clouds[params.index].sample(defaultSampler, float2(params.textureCoordinates)) * float4(1,0,0,1.0);

Редактировал вопрос. Я пробовал описанным выше способом. Но мне не удалось получить правильную текстуру на экране и он мигает ... Раньше у меня без массива все работало нормально ... Что пошло не так ...

Ruban4Axis 18.01.2019 06:08

Вам нужно будет пройти тест, чтобы узнать. Я думаю, что использование массива текстур должно быть как минимум таким же быстрым, как и код ручного переключения.

Ken Thomases 23.01.2019 17:12

Другие вопросы по теме