Cocos3D - фон показывается через сетки
Я импортировал файл.pod, созданный из Blender, и синий фон показывается через сетки для ресниц и бровей. Кто-нибудь знает, почему я сталкиваюсь с этим?
БЕЗ дополнительного материала (выглядит нормально, кроме корня волоса).
С новым зеленым материалом, добавленным к ее левому плечу, бровь и ресница начали показывать фон
1 ответ
Эта проблема вызвана порядком отображения узлов в вашей сцене.
В первой модели сначала рисуются волосы, затем кожа, затем брови и ресницы. Во второй модели волосы, брови и ресницы все нарисованы перед кожей. К тому времени, когда кожа под волосами или ресницами прорисована, буфер глубины показывает, что что-то ближе к камере уже нарисовано, и движок не беспокоит рендеринг этих пикселей кожи. Но поскольку ресницы, брови и волосы содержат прозрачность, мы в конечном итоге заглядываем сквозь них на задний план.
Такое использование буфера глубины является ключевым фактором для всего 3D-рендеринга. Это то, как движок знает, что нельзя визуализировать пиксели, которые визуально перекрыты другим объектом, в противном случае все, что мы когда-либо увидели, это последний объект, который нужно визуализировать. Однако при рендеринге перекрывающихся объектов, содержащих прозрачность, важно получить порядок визуализации правильно, так что более отдаленные объекты, которые находятся за более близкими прозрачными объектами, визуализируются первыми.
В Cocos3D есть несколько инструментов для заказа прозрачных объектов для рендеринга:
Первый и основной инструмент, это
drawingSequencer
это управляетсяCC3Scene
, Вы можете настроить несколько различных типов секвенсоров рисования. Секвенсор по умолчанию достаточно умен, чтобы сначала визуализировать все непрозрачные объекты, а затем визуализировать объекты с прозрачностью в порядке убывания расстояния от камеры (сначала рендеринг более удаленных объектов). Это работает лучше всего для большинства сцен, в частности, когда объекты движутся вокруг и могут непредсказуемо двигаться друг перед другом. К сожалению, в вашем обычаеCC3Scene
Код инициализации (который вы отправили мне в комментариях к вопросу), вы заменили секвенсор рисования по умолчанию на тот, который не упорядочивает прозрачные объекты на основе расстояния. Если вы удалите это изменение, все работает правильно.Объекты, которые не определены в явной последовательности по расстоянию (как в части 1 выше), отображаются в том порядке, в котором они добавлены в сцену. Поэтому вы также можете определить порядок рендеринга, убедившись, что объекты добавляются на вашу сцену в том порядке, в котором вы хотите их визуализировать. Это может хорошо работать для статических моделей, таких как ваш первый персонаж (если вы измените его, чтобы добавить волосы после кожи).
CC3Node
также имеетzOrder
свойство, которое позволяет явно переопределить порядок рендеринга, чтобы объекты с большимиzOrder
значение отображается перед теми, у кого меньшеzOrder
ценности. Это полезно, когда у вас есть статическая модель, компоненты которой нельзя добавить в порядке рендеринга, или для временного переопределения порядка рендеринга двух прозрачных объектов, которые могут передаваться друг перед другом. С использованиемzOrder
свойство зависит от использованияdrawingSequencer
который использует его (по умолчанию используется секвенсор рисования).Наконец, вы можете временно отключить проверку глубины или маскировку при рендеринге определенных узлов, установив
shouldDisableDepthTest
а такжеshouldDisableDepthMask
свойства кYES
на этих узлах.