У меня только что была идея для моей текущей игры, созданной с помощью opengl на c ++: я хотел бы иметь большой контур (5-6 пикселей) на нескольких перекрывающихся объектах, когда игрок что-то выигрывает.
Я подумал, что лучше всего использовать трафаретный буфер, но я пытаюсь сделать закадровый рендеринг буфера трафарета за несколько часов, и я не могу достичь какого-либо результата, так что вероятнее всего. Есть и другие техники!
Вот что я хочу получить:
Любые идеи?
Ответы:
Вот код, адаптированный из некоторого кода трафарета webGL, который у меня работает:
Я думаю, что использовал этот подход в играх RTS, чтобы нарисовать ореолы вокруг выбранных юнитов, но это было давно, и я не помню, есть ли какие-то ошибки и все нюансы.
источник
Начните с поиска всех групп объектов, где группа объектов представляет собой набор объектов, которые перекрываются. Стандартное обнаружение столкновений должно делать эту работу. Присвойте каждой группе уникальный цвет. Подойдет любой цвет.
Визуализируйте все ваши объекты как сплошные цвета, используя групповой цвет, в текстуру.
Создайте новую текстуру контура с теми же размерами, что и цель рендеринга. Просканируйте каждый тексель цели рендеринга и определите, отличается ли он от любого окружающего текселя. Если это так, замените соответствующий текст в структуре контура на нужный вам цвет линии.
Наконец, возьмите эту текстуру контура и визуализируйте ее поверх изображения, которое вы хотите нарисовать на экране (вы, конечно, можете сделать это одновременно с определением края в фрагментном шейдере и избежать создания текстуры края в первом место).
Если вы выполните этот шаг на процессоре, используя цикл for, чтобы пройти через тексели цели рендеринга, то это будет довольно медленно, но, вероятно, достаточно хорошо для тестирования и даже использования в некоторых случаях. Чтобы использовать это в режиме реального времени, вам лучше всего справиться с этим в шейдере.
Фрагментный шейдер для обнаружения края может выглядеть следующим образом;
Где второе значение в texture2D искать - это 2d координата относительно v_texCoord. Вы примените это, визуализируя первую цель рендеринга как текстуру на полноэкранном квадре. Это похоже на то, как вы применили бы эффекты размытия на весь экран, такие как размытие по Гассу.
Причина использования первой цели рендеринга со сплошными цветами состоит в том, чтобы просто убедиться, что между различными объектами, которые перекрываются, нет видимых границ. Если вы просто выполнили обнаружение краев на изображении на экране, вы, вероятно, обнаружите, что оно также обнаруживает края в перекрытиях (при условии, что объекты имеют разные цвета / текстуры / освещение).
источник