Эта проблема вызвана порядком, в котором узлы визуализируется в вашей сцене.
В первой модели сначала нарисованы волосы, затем кожа, затем брови и ресницы. Во второй модели волосы, брови и ресницы все нарисованы перед кожей. К тому времени, когда кожа под волосами или ресницами нарисована, буфер глубины указывает на то, что что-то ближе к камере уже нарисовано, и двигатель не беспокоится о том, чтобы визуализировать эти пиксели кожи. Но из-за того, что ресницы, брови и волосы имеют прозрачность, в конечном итоге мы просматриваем их на заднем плане.
Это использование буфера глубины является ключевым для всего 3D-рендеринга. Это то, как движок знает, чтобы не отображать пиксели, которые визуально закрыты другим объектом, в противном случае все, что мы когда-либо видели, было последним объектом, который нужно визуализировать. Однако при рендеринге перекрывающихся объектов, содержащих прозрачность, важно получить порядок визуализации правильно, чтобы сначала отображались более удаленные объекты, которые находятся за более прозрачными объектами.
В Cocos3D, есть несколько инструментов для вас заказать прозрачные объекты для визуализации:
Первый и основной инструмент, является drawingSequencer
, который управляется CC3Scene
. Вы можете настроить несколько различных типов секвенсеров рисования. По умолчанию секвенсор достаточно умен, чтобы сначала отображать все непрозрачные объекты, а затем визуализировать объекты, которые содержат прозрачность, в порядке убывания расстояния от камеры (сначала отбрасывая объекты). Это лучше всего подходит для большинства сцен, и в частности, когда объекты перемещаются и могут непредсказуемо перемещаться друг против друга. К сожалению, в вашем пользовательском CC3Scene
код инициализации (который вы отправили мне на вопрос), вы заменили стандартный секвенсор рисования на тот, который не выполняет последовательность прозрачных объектов на основе расстояния. Если вы удалите это изменение, все будет работать правильно.
Объекты, которые явно не упорядочены расстоянием (как в части 1 выше), отображаются в том порядке, в котором они добавлены к сцене. Таким образом, вы также можете определить порядок визуализации, гарантируя, что объекты добавляются в вашу сцену в том порядке, в котором вы хотите их визуализировать. Это может хорошо работать для статических моделей, таких как ваш первый персонаж (если вы измените его, чтобы добавить волосы после скина).
CC3Node
также имеет zOrder
свойство, которое позволяет изменить порядок рендеринга в явном виде, так что объекты с большими zOrder
значений оказываются перед теми, с меньшими zOrder
значений. Это полезно, если у вас есть статическая модель, чьи компоненты не могут быть добавлены в порядке отображения, или временно переопределить порядок рендеринга двух прозрачных объектов, которые могут проходить друг перед другом. Использование свойства zOrder
зависит от использования drawingSequencer
, который использует его (по умолчанию используется секвенсор рисования).
Наконец, вы можете временно отключить проверку глубины или маскирование при визуализации конкретных узлов, установив shouldDisableDepthTest
и shouldDisableDepthMask
свойства YES
на этих узлах.
Если вы посмотрите достаточно близко, бровь и ресницы все еще существуют. С технической точки зрения, это файлы .png с прозрачным фоном, поэтому отображение текстуры за текстурой за ней правильное. Но в этом случае текстура за бровью/ресниц - это кожа, а не синий фон. –
Очень странно. Если вы хотите создать ZIP-проект Xcode, который показывает эту проблему, поместите его куда-нибудь, как Dropbox, а затем отправьте ссылку на файл ZIP на [email protected], я посмотрю на него. –
BTW ... Вы получаете тот же эффект при запуске этого на реальном устройстве? В симуляторе часто отображаются артефакты, которые не отображаются на устройствах. –