Итак, для игры, над которой я работаю, я пытаюсь создать уникальный тип шейдеров. Большинство из них очень простые, есть только одна сложная часть. Я только хочу отобразить то, что игрок увидит в своей зоне видимости. Это 2D-игра сверху вниз, поэтому игрок обычно может видеть комнаты. Но возьмите это изображение, например.Render Area Player Посмотреть
Очевидно, что игрок здесь оранжевый круг. Областью, которую он может видеть, является серый (серый?) Заполненный участок. Черные линии представляют собой комнату, а фиолетовые линии представляют его поле зрения через дверь комнаты. Я хочу только визуализировать затененную область.
Я знаю, что у GLSL есть инструкция discard, в которой вы можете удалить определенные пиксели. Это означает, что, создав логическую функцию, я мог бы просто выполнить следующий код в моем вершинном шейдере.
if (!playerCanSeePoint(params)) {
discard;
}
Что я не знаю, как это сделать, так это сделать функцию playerCanSeePoint. Одна из моих идей заключалась в том, чтобы бросить невидимые линии от игрока по всем направлениям и найти первую точку пересечения. Это означало бы первую стену и создало бы правильную форму. Однако это кажется ресурсоемким. Так есть хороший способ сделать это?