Анимация палитры в OpenGL - PullRequest
2 голосов
/ 19 марта 2009

Я делаю 2d-игру старой школы и хочу анимировать определенный цвет в моей текстуре.

Единственные известные мне способы:

  1. шейдеры opengl.
  2. анимация только одного цветового канала.
  3. белая текстура под цветной анимацией текстуры.

Но я не хочу использовать шейдеры, я хочу сделать эту игру максимально простой, не так много дополнительных функций openGL и т. Д.

А анимация цветового канала не подходит, потому что мне нужны все цветовые каналы в моих текстурах.

В настоящее время я делаю это с 2 текстурами: белая текстура под другой текстурой, переводит определенный цвет пикселя в прозрачный, затем я меняю белый цвет текстуры с помощью функции glColor3f () на то, что я хочу, и вижу «палитру» анимация "на этот конкретный цвет.

Но этот стиль звучит довольно глупо, поэтому мне интересно, есть ли какой-нибудь лучший трюк с этим?

Ответы [ 5 ]

4 голосов
/ 03 апреля 2009

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

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

uniform vec4 fvReplaceColor;
uniform sampler2D baseMap;
varying vec2 Texcoord;

void main( void )
{
     vec4  fvBaseColor = texture2D( baseMap, Texcoord);

     if(fvBaseColor == vec4(1.0, 1.0, 1.0, 1.0))
          fvBaseColor = fvReplaceColor;

     gl_FragColor = fvBaseColor;
}

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

2 голосов
/ 27 мая 2010

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

Решение, которое вы имеете сейчас, звучит разумно, тем более что оно, вероятно, будет работать везде.

1 голос
/ 19 марта 2009

Как насчет использования палитрных текстур? Для этого есть расширение . Если использование расширений не подлежит сомнению, вы можете просто выполнить палитру самостоятельно. Просто делайте ваши палитровые трюки, их много, и просто пишите RGB-текстуру, используя палитру. Конечно, это ограничивает количество цветов, но в этом весь смысл использования палитры.

Программы рисования, которые хороши для обработки палитры, в настоящее время редки. Вот почему я не буду удалять Deluxe Paint с моего диска.

0 голосов
/ 21 июня 2010

Я думаю, что для 2D-игры лучше использовать расширение ARB_vertex_program, чем GLSL. Есть еще драйверы OpenGL, которые не поддерживают GLSL , но поддерживают ARB_fragment_program . Поддержка палитровых текстур в настоящее время отсутствует, но видеокарты до шейдерного возраста могут поддерживать ее. Смотрите ссылки для статистики.

Старый язык ARB является языком ассемблера низкого уровня, но вы можете использовать язык Cid от NVidia для компиляции шейдеров в этот формат. Несмотря на то, что это технология NVidia, она работает для всех графических процессоров. Тем не менее, если вы программируете игру для собственного удовольствия, это может не стоить хлопот.

0 голосов
/ 19 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...