Замена палитры Sprite Color в Pixel Shader

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

XMFLOAT3 palette[10][2];

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

float4 xPalette[10][2];

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


person János Turánszki    schedule 12.02.2013    source источник


Ответы (1)


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

Затем вы можете просто сэмплировать/сравнивать каждый тексель в верхней строке во время шейдера.

person MrLeap    schedule 12.02.2013
comment
Спасибо за ответ. Я уже думал о текстурных картах для этого, и такие текстуры, вероятно, было бы легко создать разработчику, но я бы не знал, как создавать текстуры во время выполнения (ибо я пытаюсь сделать редактор для цветов, а также ), поэтому я попытался сделать более гибкий подход (для меня это так). Я предполагаю, что это вполне выполнимо, так что пора поискать в Интернете. Еще раз спасибо за ответ! - person János Turánszki; 13.02.2013
comment
Спасибо, однако, я понял это, это была еще одна проблема с 16-битным выравниванием (и я не замечал, ааа, случалось так много раз). Я думал, что при объявлении и отправке массивов XMFLOAT3 в пиксельный шейдер будут отправлены 4-элементные числа с плавающей запятой, причем последний элемент будет обнулен (как это происходит с одним переданным). Однако, поскольку я отправлял их массивы, это испортило бы все, потому что последний элемент (который, как я думал, будет нулем) заменяется первым элементом следующей записи и испортит всю структуру. Я заметил это по принтскрину и выборке цветов. - person János Turánszki; 13.02.2013