Почему OpenGL не обрезает примитивы из моего геометрического шейдера, которые частично находятся вне области просмотра? - PullRequest
1 голос
/ 02 августа 2011

http://www.opengl.org/wiki/Rendering_Pipeline_Overview говорит, что «примитивы, лежащие на границе между внутренней частью тома просмотра и внешней стороной, разделяются на несколько примитивов» после запуска геометрического шейдера и до растеризации фрагментов.Все остальное, что я когда-либо читал об OpenGL, также описывало процесс отсечения.Однако, установив gl_FragDepth в фрагментном шейдере на значения, которые ближе к камере, чем фактическая глубина точки в треугольнике, который его сгенерировал (так, чтобы фрагмент прошел тест глубины, когда он не прошел бы, если бы я копировал фиксированныйфункциональность конвейера), я обнаружил, что фрагменты генерируются для всего исходного треугольника, даже если он частично перекрывает дальнюю плоскость просмотра.С другой стороны, если все вершины находятся за плоскостью, весь треугольник обрезается и фрагменты не отправляются фрагментному шейдеру (я полагаю, более технически вы бы сказали, что он обрезан, а не обрезан).

Что здесь происходит?Мой геометрический шейдер заменяет некоторые функции по умолчанию?Есть ли какие-либо флаги / подсказки, которые мне нужно установить, или дополнительные встроенные переменные, в которые мне нужно записать, чтобы на следующем этапе конвейера рендеринга было известно, как выполнить частичное отсечение?

Я использую GLSLверсия 1.2 с расширением GL_EXT_geometry_shader4 на NVIDIA GeForce 9400M.

Ответы [ 2 ]

1 голос
/ 02 августа 2011

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

Конечно, это такой угловой случай, что я сомневаюсь, что кто-нибудь собирается с этим что-нибудь сделать.

Большинство графического оборудования старается изо всех сил стараться избегать фактически обрезающих треугольников. Обрезание треугольников означает потенциально генерирование 3+ треугольников из одного треугольника. Это имеет тенденцию душить трубопровод (во всяком случае, предварительная тесселяция). Поэтому, если треугольник не является тривиально отклоняемым (то есть: за пределами рамки клипа) или невероятно большими, современные графические процессоры просто игнорируют его. Они позаботятся об оборудовании для отбраковки фрагментов.

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


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

Ограничение глубины является функцией OpenGL 3.2, но NVIDIA поддерживает его уже почти десятилетие с помощью NV_depth_clamp. А если у вас последние версии драйверов, вы сможете использовать ARB_depth_clamp, даже если у вас нет контекста совместимости 3.2.

0 голосов
/ 02 августа 2011

Если я вас правильно понял, вы удивляетесь, что ваши треугольники не соприкасаются с дальней плоскостью.
Afaik OpenGL просто обрезает 4 граничные плоскости после сборки вершины. Дальнее и ближнее отсечение выполняется (по спецификации afaik) после фрагмента шейдера. То есть, когда вы сильно увеличиваете изображение и полигоны сталкиваются с ближней плоскостью, они отображаются в этой точке и не исчезают в целом.
И я не думаю, что спецификации вообще отмечают разбиение примитивов (даже когда hw может делать это в пространстве экрана, игнорируя fragdepth), он просто отмечает пропуск примитивов в целом (в случае, когда ни одна вершина не лежит в усеченной области вида).
Также полагаться на вики для точных слов - это всегда плохая идея.

PS: http://fgiesen.wordpress.com/2011/07/05/a-trip-through-the-graphics-pipeline-2011-part-5/ очень хорошо объясняет фактическую границу, а также ближнее и дальнее отсечение.

...