2013-02-12 2 views
2

Я занимаюсь созданием спрайтов, основанных на спрайтах, и разработка дошла до такой степени, что я хочу реализовать замену цвета изображений во время выполнения (так что пользователь может указать через интерфейс , какой точный цвет следует изменить на что, и это будет сделано в одно мгновение, без какого-либо прерывания экрана загрузки). Я понял, что это будет довольно легко достигнуто в пиксельном шейдере. Я попробовал это, установив значения для изменения другого цвета, и он работал достаточно хорошо. Для следующего шага я хотел, чтобы он считывал данные из текстового файла (содержащего цветовые коды цвета для изменения, а затем цвет для изменения). Он имеет несколько записей, и она хранится в массиве, как это:Сценарий замены цветовой палитры Sprite в пиксельном шейдере

XMFLOAT3 palette[10][2]; 

А вот соответствующая константа запись в шейдере:

float4 xPalette[10][2]; 

Что это значит, он хранит 10 цветов для изменения и 10 цветов, чтобы изменить их. Я передаю это в Pixel Shader через постоянный буфер, и он не работает так, как планировалось, потому что признана только последняя запись массива, все остальные - нулями. Я думаю, это было бы потому, что 16-битное выравнивание перед отправкой данных на GPU? Какой еще метод для отправки таких данных в пиксельный шейдер? Спасибо, что прочитали это!

ответ

1

Вы можете отправить свои свопы в качестве самой текстуры, причем, возможно, верхняя строка текстов те, которые вы хотите заменить, с [x] [y + 1] в качестве цвета, который вы хотите изменить. (Поскольку координаты текстуры варьируются от 0 до 1, вам, вероятно, придется передать в качестве целого число цветов, которые вы заменяете, а затем вы можете индексировать с помощью (1/replaceCount * i). GLSL позволяет передавать текстуры с помощью параметра sampler2D's I думаю. Я предполагаю, что это похоже с HLSL (уже несколько месяцев, так как я написал HLSL, хотя. :()

Тогда вы могли бы просто образец/сравнить каждый текселей в верхней строке во время вашего шейдера.

+0

Спасибо за Я уже думал о текстурных картах для этого, и такие текстуры, вероятно, были бы легко созданы разработчиком, но я не знал бы, как создавать текстуры во время выполнения (поскольку я пытаюсь создать редактор для цветов), поэтому я попытался сделать более гибкий подход (для меня это так). Я предполагаю, что это полностью выполнимо, поэтому время для поиска в Интернете. Еще раз спасибо за ответ! –

+1

[Это один из способов прагматически создать вашу текстуру, если вам это интересно.] (Http://stackoverflow.com/questions/14802205/creating-texture-programmatically-directx) – MrLeap

+0

Спасибо, hoverwer, i «Я понял, что это снова проблема с 16-битным выравниванием (и я не замечаю Arrgh, случалось так много раз). Я подумал, что с помощью declarig и отправки массивов XMFLOAT3 в пиксельный шейдер отправил бы 4-элементные поплавки, а последний элемент был обнулен (как и с одним переданным). Hovewer, потому что я отправлял массивы из них, это испортило бы все, потому что последний элемент (который, как я думал, был бы равен нулю) заменен первым элементом следующей записи и закручивает всю структуру. Я заметил это с помощью Printscreen и сэмплирования цветов. –

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