2016-08-20 1 views
0

Я хочу создать функцию, которая принимает несколько текстур и добавляет их и разбивает их рядом друг с другом. Например, если у меня был IMGA, imgB, IMGC я могу получить текстуру, как это:Добавление текстур с использованием HLSL

AAB

CBB

BCA

Рекомендуем также изображения не должны быть одинакового размера, так что я мог бы получить что-то вроде этого:

AAB C

CBB

BAC C

Кто-нибудь, как я могу это сделать в HLSL, на каких функциях я должен смотреть? Есть ли у вас синтаксический пример?

Спасибо :)

EDIT: Я не совсем доволен ответами еще, я буду изучать их более подробно, то, возвращаясь к этому вопросу

ответ

1

Запуск петли в HLSL пиксельных шейдеров это не лучшая идея. Скорее всего, проще потопить вершины, соответствующие желаемой текстурированной текстуре.

Прежде всего, вы бы хотели создать текстурный атлас, т. Е. Большую текстуру, содержащую все текстуры, которые вы хотите скомпоновать. Затем вы производите один квадрат (2 треугольника) за другим в желаемом расположении.

  • Вы можете использовать n Draw звонки: по одному квадрату за раз.

  • Вы можете создать один большой буфер вершин с предварительно вычисленными или частично вычисленными позициями плитки и использовать один вызов Draw.

  • Или вы можете сделать один звонок DrawInstanced. Это то, как карты на основе плитки отображаются в большинстве игр.


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

+0

ОК, спасибо, концепция атласа выглядит интересной. вы рекомендуете какие-либо учебники?Это первый случай, когда я пытаюсь написать шейдер, что-нибудь поможет –

+1

Loop уже не так уж плох, а графические процессоры достаточно гибкие, чтобы увидеть большинство ресурсов, необходимых для этого, текстура Bindless, например, позволяет связывать все текстуры, независимо от того, там форматы и размер и выберите тот, который вам нужен внутри HLSL, либо из текстуры косвенности, атрибутов вершин и т. д. Но в вопросе OP он не собирается делать никаких хороших традиционных решений, вырезая экран в квадрациклах с вершинами для каждого текстура является самой простой. – galop1n

0

Этот вопрос мало для широкого, существует множество способов сделать то, что вы описали. Некоторые решения, вероятно, могли бы использовать большой шейдер uber и встроили большую часть логики в hlsl, но это не кажется правильным и сложным ни для чего. Было бы доступнее смешивать с некоторой сгенерированной геометрией для каждой части экрана.

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

+0

интересный подход, так что вы говорите, что мне не нужно делать это в шейдере, я могу просто сделать это с помощью обычного скрипта и просто создать скрипт самой геометрии. Но разве это не увеличило бы призывы к розыгрышу? –

+0

Сколько призывов на призывы вы считаете? Даже если у вас есть тысяча уникальных текстур плитки на экране, тысячи вызовов призывов не так уж плохи, если вы делаете это правильно и только текстура меняется между ними, а не шейдер. Сначала вы должны сосредоточиться на том, чтобы что-то работать, а затем оптимизировать, если есть проблемы с перфорацией, используя атлас или что-то еще. – galop1n

Смежные вопросы