Как закрасить определенный раздел спрайта - PullRequest
0 голосов
/ 28 ноября 2011

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

ScreenShot из движка http://i44.tinypic.com/qxqlix.jpg

1 Ответ

1 голос
/ 28 ноября 2011

Ну, это зависит от того, как вы делаете освещение.

По сути, спрайты - это просто текстурированные квадраты, состоящие из двух треугольников.

Традиционное освещение на основе вершин (которое поддерживается встроенными, но теперь устаревшими функциями) будет просто вычислять освещение для 4 углов этого четырехугольника, и все остальное будет интерполировано. Это довольно быстро, но может привести к неправильному освещению, особенно при точечном освещении и больших квадратах.

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

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

Просто для пояснения значения некоторых терминов в этом контексте:

  • на пиксель : на пиксель в текстуре эти значения могут быть интерполированы
  • на пиксель : на выходной пиксель, то есть на пиксель экрана

Редактировать :

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

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

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

Редактировать 2 :

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

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

Результат этого вычисления может быть примерно таким (ASCII art):

|       |         /
|_______|________/             
                 | /     |       |
                 |/______|_______| 

Линии, указывающие вверх - это нормали, нижние линии - ваши спрайты на виде сбоку.

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