OpenGL, похоже, использует (слишком агрессивно) отсечение усеченного конуса, которое я не вижу, как изменить

Я пытаюсь заставить приложение OpenGL работать на С ++. OpenGL, кажется, отсеивает удаленные и близкие объекты.

введите описание изображения здесь

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

Я не использую отсечение усеченной вершины, единственное, что я включил, - это отсечение задней грани. Есть ли в OpenGL по умолчанию какая-то усеченная пирамида? Есть ли что-то, что мне нужно включить с помощью glEnable, чтобы все мои треугольники действительно отображались? Включение GL_DEPTH_TEST останавливает рендеринг абсолютно всего, независимо от того, вызову ли я впоследствии glFrustum (...).

Спасибо.


person Jimmy Diddler    schedule 13.07.2019    source источник
comment
При использовании перспективной проекции вы определяете фуструм, ограниченный шестью плоскостями. Два из этих самолетов - дальний и ближний. Все, что находится за пределами фуструма, отбрасывается.   -  person Ripi2    schedule 13.07.2019
comment
Да, OpenGL не рисует ничего за пределами диапазона [-1,1] в пространстве клипа. Предположительно, вы используете перспективную проекцию, параметры nearz и farz которой определяют диапазон пространства клипа по оси z.   -  person Frank    schedule 13.07.2019
comment
Есть ли способ увеличить параметры nearz и farz? Я видел, как пара людей упоминала nearz и farz, но я все еще не уверен, о чем именно они говорят?   -  person Jimmy Diddler    schedule 13.07.2019
comment
@JimmyDiddler да, вы просто меняете числа, переданные в gluPerspective или что бы вы ни использовали вместо этого ... будьте осторожны, zfar/znear сильно влияют на точность буфера глубины ... так что не рекомендуется иметь очень большое соотношение ... Если включение GL_DEPTH_TEST скрывает все вы либо находитесь за пределами диапазона, либо размещаете вещи за / внутри камеры, либо просто имеете неправильную комбинацию glDepthFunction против значения очистки dept ... вы переместили камеру немного назад, по крайней мере, на znear (фокусное расстояние) или вместо этого переместили объект вперед?   -  person Spektre    schedule 14.07.2019
comment
Неясно, какие преобразования вы используете (если они вообще используются), поэтому сложно ответить на этот вопрос.   -  person derhass    schedule 14.07.2019


Ответы (2)


Где-то в вашем коде вы должны инициализировать projectionMatrix:

auto projectionMatrix = glm::mat4 perspective(fovy, aspect, zNear, zFar);

or

auto projectionMatrix = gluPerspective(fovy, aspect, near, far); 

что-то вроде строки выше. ZNear и zFar определяют нижнюю и самую дальнюю границы пирамиды. Эти значения будут отображать позицию вашего фрагмента в [-1, +1].

Каждый фрагмент с z == near будет сопоставлен с -1. Все с глубиной меньше ближней будет отброшено.

Попробуйте найти все параметры ближнего и дальнего и изменить их значения на то, что подходит для вашей сцены. Избегайте 0 как ближайшего значения, вы также можете попробовать переместить камеру, чтобы увидеть, что происходят какие-то изменения.

person Paltoquet    schedule 14.07.2019

Фиксированный. Не уверен, почему, но это были только части треугольника с мировыми координатами (в отличие от координат относительно камеры) между 1 и -1. Исправлено использованием gluPerspective () вместо glMatrixMode (GL_PROJECTION) с последующим вызовом glFrustum (...).

По-прежнему никто не знает, почему он не сломался, но, по крайней мере, сейчас он работает :)

person Jimmy Diddler    schedule 14.07.2019
comment
Если вы используете glMatrixMode или glFrustum, то вы используете 15-летний устаревший OpenGL и, возможно, захотите перейти на современный OpenGL. - person gman; 14.07.2019
comment
в старом API GL все операции с матрицами выполняются с матрицей, выбранной glMatrixMode, поэтому вы должны вызывать ее еще до gluPerspective - person Spektre; 15.07.2019
comment
@gman new api супер, но ненадежен (особенно на старых, не игровых компьютерах), есть много компьютеров, на которых расширенные функции просто не работают должным образом (обычно из-за плохой реализации GL поставщиками gfx), поэтому его использование приводит к поставщику и даже код для конкретной карты, который сложно поддерживать и дорого ... много раз возвращаться к старому API, поскольку новый не обеспечивает надежную визуализацию даже базовых функций. Так что режим совместимости на помойку пока не закидывал. Можно было бы подумать, что с меньшим количеством поставщиков на рынке gfx ситуация улучшится, но нет :( - person Spektre; 15.07.2019
comment
Мой опыт противоположен. Новый API намного меньше по размеру и, следовательно, с гораздо меньшим количеством ошибок. Старый API очень подвержен ошибкам, потому что он устарел. И, если вы беспокоитесь о неигровых компьютерах, OpenGL - совсем не то, что вам нужно. OpenGL не устанавливается по умолчанию на старых компьютерах. Это даже не доступно в некоторых конфигурациях. По этой причине и Firefox, и Chrome используют ANGLE для эмуляции OpenGL поверх DirectX, а не напрямую. Я знаю это, потому что написал инфраструктуру графического процессора в Chrome. - person gman; 15.07.2019
comment
Ядро нового API также в основном переносимо на Mac / Windows / Linux / iOS / Android / RaspberryPI. Старый API работает только на настольных компьютерах. Итак, вы упоминаете продвинутые вещи, но если вы делаете продвинутые вещи, то вы не используете старый api или смешиваете старое с новым. Просто ты новенький, и будешь в большей безопасности. - person gman; 15.07.2019
comment
вам также может быть интересно узнать, что у OpenGL до недавнего времени не было официальных тестов на соответствие. Теперь они есть. Они тестируют только новый API, а не старый. - person gman; 15.07.2019