Отключить отбраковку объекта - PullRequest
0 голосов
/ 29 июня 2011

Этот вопрос на самом деле относится к Unity3D, но он также может быть более общим, поэтому я собираюсь сделать этот вопрос как можно более общим.

Предположим, у меня есть сцена с camera (near = 0.3, far = 1000, fov = 60)и я хочу нарисовать skydome, радиус которого составляет 10000 единиц.

Объект не отбракован усечением камеры, потому что я нахожусь внутри купола.Но вершины каким-то образом отбраковываются каким-то шейдером, и конечный результат выглядит следующим образом:

My clipped skydome

Теперь мой вопрос:

какие настройки длялюбой движок, который я могу изменить, чтобы убедиться, что весь объект нарисован и не обрезан в дальней плоскости камеры?

Чего я не хочу:

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

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Я не знаю, как это сделать в Unity, но в DirectX и в OpenGL вы отключаете zbuffer (как проверки, так и записи) и сначала рисует скайбокс.

Затем вы включаете zbuffer и рисуете остальную часть сцены.

Я думаю, что Unity может сделать все это за вас.

0 голосов
/ 30 июня 2011

У меня есть два решения для моей собственной проблемы.Первый не решает все.Второй делает, но противоречит моим собственным принципам проектирования.

У меня не было возможности изменить z-запись шейдера, что является отличным решением от @Erno, потому что используемые шейдеры являются сторонними.

Опция 1

Непосредственно перед визуализацией объекта установите дальнюю плоскость на 100 000 и установите ее обратно на 1000 после рисования неба.

Проблема: буфер глубины по-прежнемузаполнены значениями от очень низких до 100000.Это снижает точность буфера глубины и создает проблемы с z-боями и пост-эффектами, которые зависят от буфера глубины.

Опция 2

Создайте две камеры, связанные друг с другом.Камера 1 сначала отображает skydome с настройкой far = 100000, near = 100.Камера 2 очищает буфер глубины и рисует остальную часть сцены с настройкой far = 1000, near = 0.3.Буфер глубины теперь не содержит больших значений, поэтому это решает проблемы неточных буферов глубины.

Проблема: Камеры должны быть связаны какой-либо системой опроса, потому что в классе камеры нет событий изменения.(например, когда изменяется FoV).Мне нравится тот факт, что есть только одна камера, но это не так просто.

...