Можно ли отбросить треугольник от рендеринга с использованием вершинных шейдеров? - PullRequest
4 голосов
/ 25 февраля 2011

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

Говоря SM 3.0 здесь - для полноты обсуждения новых версий приветствуется.

1 Ответ

2 голосов
/ 03 марта 2011

Геометрический шейдер может сделать это тривиально, как вы, наверное, знаете, но в SM3 такого нет.

Вершинному шейдеру трудно идентифицировать треугольник как таковой, поскольку все, что видит вершинный шейдер, это отдельные вершины. Но ... в принципе это возможно.

Если вы установите нулевую координату w, точка будет проецироваться на бесконечность. Установите координаты w всех точек на ноль, и весь треугольник будет на бесконечности, чтобы он не отображался.

В качестве альтернативы, вы могли бы, вероятно, установить gl_ClipDistance на ноль или значение ниже нуля (никогда не использовал их, но я думаю, это должно работать). Это отметило бы вершину как "позади" плоскости отсечения. Если все три вершины находятся за плоскостью отсечения, треугольник не виден.

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

...