2016-06-14 2 views
2

Я программирую игру в Allegro 5, и сейчас я работаю над своим алгоритмом рисования. После вычисления я заканчиваю двумя ALLEGRO_BITMAP* -объектами, где одна из них - моя «сцена» с изображенной на ней землей, а другая - теневой картой.Есть ли способ частично закрасить растровые изображения в Allegro?

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

Для рисования этих растровых изображений на экране я использую al_draw_scaled_bitmap(...) и al_set_blender(ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE), чтобы вычеркнуть белые элементы теневой карты со сцены, чтобы сделать их видимыми.

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

Окончательный цвет может быть рассчитан как p.r * c.r + 1 - p.r с p = the pixel-color on the scene и c = the world-color для красного, зеленого и синего каналов в rgb.

Есть ли способ добиться частичного тонирующего эффекта в Allegro 5 (возможно, без массивного переубеждения) ?

Я думал об использовании шейдеров, но я не нашел решения для их реализации с моими ALLEGRO_BITMAP* -объектами.

+0

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

ответ

3

Блендеры Allegro довольно просты, поэтому для этого вам понадобится шейдер. Просто напишите шейдер, и когда вы рисуете свою теневую карту al_use_shader шейдер, а затем al_use_shader(NULL), когда закончите. Шейдер может использовать источник вершин по умолчанию, который можно получить с помощью al_get_default_shader_source. Таким образом, вам нужно только написать шейдер фрагмента. Ваш шейдер фрагмента должен иметь uniform vec4, который является цветом оттенка. Вы также должны иметь x, y floats, которые отображают значения x и y адресата. Он также будет иметь сэмплер, который является растровым изображением сцены (который должен быть целью, поскольку вы рисуете на нем). Вы пробовали бы из семплера в x, y (x и y должны быть от 0 до 1, вы можете получить их с помощью xpixel/width (то же самое с y)), а затем выполните вычисления с цветом ввода, а затем сохраните результат в gl_FragColor (этот текст предполагает, что вы используете GLSL (OpenGL). Тот же принцип применяется к Direct3D.) Проверьте шейдеры по умолчанию в src/shader_source.inc в исходном коде Allegro для получения дополнительной информации о написании шейдеров.

+0

Спасибо, я попробую! – 0liCom

+0

+1 Прекрасно работает, даже если я немного изменил его и использовал растровое изображение backbuffer, где все было нарисовано, чтобы вычислить тени и нарисовать это на дисплее-backbuffer. Все еще можно улучшить, но он работает, и это все, что я хочу в данный момент, производительность достаточно хороша – 0liCom

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