Java2D лучший способ выбрать различные изображения с перекрытием альфа-фона?

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

Я знаю, что типичным методом было бы каким-то образом закодировать глубину отдельных пикселей в буфере глубины и посмотреть его. Однако я не знаю, как я могу сделать это эффективно в Java2D. Как мне сохранить буфер глубины? Как мне отфильтровать альфу в изображении? И т.п.

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

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

Вот изображение того, с чем я работаю: введите здесь описание изображения


person Jeremy    schedule 10.09.2013    source источник
comment
Java.awt.Colors имеют альфа-значение... поэтому кажется, что большая часть работы уже сделана, если вы сначала рисуете плитки, которые находятся за другими плитками.   -  person clwhisk    schedule 11.09.2013


Ответы (1)


Я решил это довольно хорошо. Решение на самом деле очень простое, просто нестандартное.

Графика сортируется по глубине с помощью TreeMap, а затем отображается на экране. Можно просто пройти по этому TreeMap в обратном порядке (и сохранить его до следующего цикла рендеринга), чтобы преобразовать местоположение курсора в правильное изображение, на которое он падает (проверив пиксели [в обратном порядке рендеринга] и проверив, прозрачны ли они).

Решение находится в проекте с открытым исходным кодом, в классе io.github.jevaengine.world.World, метод pick. https://github.com/JeremyWildsmith/JevaEngine/blob/master/jevaengine/src/main/java/io/github/jevaengine/world/World.java

person Jeremy    schedule 14.01.2014