2015-06-26 3 views
-1

Итак, для игры, над которой я работаю, я пытаюсь создать уникальный тип шейдеров. Большинство из них очень простые, есть только одна сложная часть. Я только хочу отобразить то, что игрок увидит в своей зоне видимости. Это 2D-игра сверху вниз, поэтому игрок обычно может видеть комнаты. Но возьмите это изображение, например.Render Area Player Посмотреть

An example of a room and players view

Очевидно, что игрок здесь оранжевый круг. Областью, которую он может видеть, является серый (серый?) Заполненный участок. Черные линии представляют собой комнату, а фиолетовые линии представляют его поле зрения через дверь комнаты. Я хочу только визуализировать затененную область.

Я знаю, что у GLSL есть инструкция discard, в которой вы можете удалить определенные пиксели. Это означает, что, создав логическую функцию, я мог бы просто выполнить следующий код в моем вершинном шейдере.

if (!playerCanSeePoint(params)) { 
    discard; 
} 

Что я не знаю, как это сделать, так это сделать функцию playerCanSeePoint. Одна из моих идей заключалась в том, чтобы бросить невидимые линии от игрока по всем направлениям и найти первую точку пересечения. Это означало бы первую стену и создало бы правильную форму. Однако это кажется ресурсоемким. Так есть хороший способ сделать это?

ответ

0

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

Затем вы можете триангулировать многоугольник и использовать трафарет для предотвращения рисования за его пределами.

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