Как создать шейдер для маскирования, используя смещение градуса от центральной точки? - PullRequest
2 голосов
/ 31 июля 2011

Я немного растерялся, и это в некоторой степени связано с другим вопросом Я задал вопрос о фрагментных шейдерах, но выходит за рамки этого.

У меня есть орфографическая сцена (хотя это может и не относиться), где сцена нарисована здесь черным, и у меня есть один спрайт с билбордом, который я рисую с помощью шейдера, который я показываю красным.У меня есть точка, которую я знаю и определяю сама, A , представленная синей точкой, в некоторой координате x, y в 2d координатном пространстве.(Нижний левый угол экрана - оригинал).Мне нужно замаскировать красный рекламный щит программным способом, где я указываю от 0% до 100%, при этом 0% полностью не повреждены, а 100% полностью замаскированы.Я могу либо передать 0-100% (от 0 до 1,0) в шейдер, либо я могу предварительно вычислить угол, любое из решений будет хорошим.

Here you can see the scene drawn with '0%' masking (Здесь вы можете увидеть сцену, нарисованную с помощью '0% 'masking)

Поэтому, когда я установил "15%", я хочу, чтобы появилось следующее:

15% (Здесь вы можете увидеть сцену, нарисованную с маскированием '15%')

И когда я устанавливаю «45%», я хочу, чтобы появилось следующее:

45% (Здесь вы можете увидеть сцену, нарисованную с маскировкой «45%»)

А вот пример "80%":

80%

Общая идея, я думаю, состоит в том, чтобы передать в единообразном vec2d "A" и внутри фрагменташейдер Я определяю, находится ли фрагмент в пределах области от 'A' до нижней части экрана, до линии, которая является правильным углом, смещенным по часовой стрелке оттуда.Если в этой области, откажитесь от фрагмента.(Отбрасывание имеет больше смысла, чем установка альфа на 0.0 или 1.0, если вы сохраняете, верно?)

Но как я могу на самом деле добиться этого ??Я не понимаю, как реализовать этот алгоритм с точки зрения шейдера.(Я использую OpenGL ES 2.0)

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Одним из решений этой проблемы было бы вычисление разницы между gl_FragCoord (я надеюсь, что существует в ES 2.0!) И точкой (необходимо убедиться, что точка находится в координатах экрана) и использованием atan функция с двумя параметрами, давая вам угол. Если угол - это не то значение, которое вам нравится (больше минимального и меньше максимального), убейте фрагмент.

Конечно, убийство фрагментов - не самое эффективное действие. (Несколько более сложное) решение треугольника все еще может быть быстрее.

EDIT:
Чтобы лучше объяснить «не совсем производительную вещь», учтите, что уничтожение фрагментов по-прежнему приводит к запуску фрагментного шейдера (после этого он только отбрасывает результат) * и мешают раннему отклонению фрагмента глубины / трафарета.
Создание веерного треугольника, подобного предложенному whoplisp, более трудоемко, но не будет обрабатывать фрагменты, которые не видны, не будут мешать отклонению глубины / трафарета, а также могут выглядеть лучше в некоторых ситуациях (например, MSAA).

2 голосов
/ 31 июля 2011

Почему бы вам просто не нарисовать несколько черных треугольников поверх красного прямоугольника?

...