На каком этапе выполняется отсечение в графическом конвейере? - PullRequest
3 голосов
/ 29 марта 2020

Я пишу мягкое средство визуализации на C ++ для целей обучения, и я достиг некоторого блока. Я не знаю, что я что-то упустил, но я не уверен, когда выполняется отсечение. Некоторые источники говорят о том, что это происходит в пространстве клипа после применения матрицы перспективной проекции, но до разделения перспективы (так и в трехмерном пространстве). Другие источники говорят о выполнении этого в 2D-пространстве (после разделения перспективы) с помощью алгоритма, такого как алгоритм отсечения линий Коэна-Сазерленда. Если я должен обрезать изображение в трехмерном пространстве, то используется ли буфер глубины только для принятия решения, в каком порядке растеризовать объекты, или я должен обрезать изображение в 2D, но также для предотвращения растеризации точек за пределами -1 в буфере z?

По сути, информация по этому вопросу не очень ясна, и я на самом деле не видел, как можно фактически обрезать в однородном пространстве клипа. Говорят, что вы должны это сделать, но никто не показывает, как.

Ответы [ 2 ]

5 голосов
/ 29 марта 2020

Обрезание выполняется на этапе Вершинная пост-обработка в конвейере рендеринга .

Примитивы обрезаются до объема просмотра в зависимости от однородная позиция в пространстве клипа его вершин (gl_Position), перед делением перспективы . Правило отсечения:

-w <=  x, y, z  <= w.

Для получения подробной информации см. Спецификация профиля ядра API OpenGL 4.6 - 13.7 Примитивное отсечение

2 голосов
/ 29 марта 2020

Некоторые источники говорят о том, что это происходит в пространстве клипа после применения матрицы перспективной проекции, но до разделения перспективы (так и в трехмерном пространстве). Другие источники говорят о выполнении этого в 2D-пространстве (после разделения перспективы) с помощью такого алгоритма, как отсечение линий Коэна-Сазерленда

Традиционные алгоритмы отсечения, такие как отсечение линий Коэна-Сазерленда или многоугольника Сазерленда-Ходжмана может быть описано в 2D, но в принципе они работают и в 3D.

По сути, информация по этому вопросу не очень ясна, и я на самом деле не видел, как можно на самом деле обрезать в однородном пространстве клипа. Говорят, что вы должны это сделать, но никто не показывает, как.

Это естественно следует из определения однородного пространства и условия отсечения -w <= x,y,z <= w. Рассмотрим обрезку отрезка прямой линии AB (и обрезка многоугольника может быть в основном реализована как последовательность обрезки линии по краям многоугольника). Алгоритм обрезки линий Коэна-Сазерленда тривиально расширяется до однородного пространства, вы просто применяете -w и w в качестве границ объема просмотра в каждом измерении. Для фактического расчета пересечения нам нужно найти новую однородную точку C =(C_x, C_y, C_z, C_w)^T, чтобы C лежал на плоскости пересечения и на AB, поэтому нам нужно найти t для

C = t * A + (1-t) * B

Предположим, что мы хотим обрезать ближайшую плоскость, которая равна z = -w.

Для C до l ie на этой плоскости, отсюда следует, что C_z = -C_w. Что оставляет нас с простой линейной системой уравнений:

C_x = t * A_x + (1-t) * B_x
C_y = t * A_y + (1-t) * B_y
C_z = t * A_z + (1-t) * B_z = -t * A_w - (1-t)*B_w
C_w = t * A_w + (1-t) * B_w 

Из уравнения для C_z, если следует, что:

t = (B_z + B_w) / ( (B_z + B_w) - (A_z + A_w))

Также обратите внимание, что это t также может быть используется для интерполяции всех связанных атрибутов вершин для C. Линейная интерполяция вполне достаточна даже в случаях с искажением перспективы, потому что мы находимся здесь до разделения на перспективы, где вся трансформация перспективы совершенно аффинна относительно. 4D пространство, в котором мы работаем.

...