Cocos3D — фон показан через сетки

Я импортировал файл .pod, созданный из Blender, и синий фон отображается через сетки для ресниц и бровей. Кто-нибудь знает, почему я сталкиваюсь с этим?

БЕЗ дополнительного материала (выглядит нормально, кроме корня волос). введите здесь описание изображения

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


person Loc Pham    schedule 16.12.2014    source источник
comment
Если вы посмотрите достаточно близко, бровь и ресница все еще там. С технической точки зрения, это файлы .png с прозрачным фоном, поэтому правильно показывать текстуру позади текстуры. Но в этом случае текстура за бровями/ресницами — это кожа, а не синий фон.   -  person Loc Pham    schedule 16.12.2014
comment
Очень странно. Если вы хотите создать ZIP-файл проекта Xcode, который показывает эту проблему, поместите его куда-нибудь, например, в Dropbox, а затем отправьте ссылку на ZIP-файл на адрес [email protected], я посмотрю на него.   -  person Bill Hollings    schedule 17.12.2014
comment
Кстати... вы получаете тот же эффект при запуске на реальном устройстве? Симулятор часто отображает артефакты, которых нет на устройствах.   -  person Bill Hollings    schedule 17.12.2014
comment
Я попытался загрузить на iPhone 5, и наблюдалось такое же поведение. Я отправил ссылку на проект xCode на указанное выше электронное письмо. Я очень ценю вашу помощь в этом. Большое спасибо.   -  person Loc Pham    schedule 17.12.2014


Ответы (1)


Эта проблема вызвана порядком, в котором узлы отображаются в вашей сцене.

В первой модели сначала рисуются волосы, затем кожа, потом брови и ресницы. Во второй модели волосы, брови и ресницы рисуются перед кожей. К тому времени, когда кожа под волосами или ресницами отрисовывается, буфер глубины показывает, что что-то ближе к камере уже отрисовано, и движок не беспокоится об отрисовке этих пикселей кожи. Но поскольку ресницы, брови и волосы содержат прозрачность, в конечном итоге мы смотрим сквозь них на фон.

Такое использование буфера глубины является ключом ко всему 3D-рендерингу. Это то, как движок знает, что нельзя отображать пиксели, которые визуально перекрываются другим объектом, иначе все, что мы когда-либо видели, было последним отрендеренным объектом. Однако при рендеринге перекрывающихся объектов, содержащих прозрачность, важно получить порядок рендеринга. правильно, так что более удаленные объекты, которые находятся за более близкими прозрачными объектами, визуализируются первыми.

В Cocos3D есть несколько инструментов, позволяющих заказать прозрачные объекты для рендеринга:

  1. Первым и основным инструментом является drawingSequencer, которым управляет CC3Scene. Вы можете настроить несколько различных типов секвенсоров рисования. Секвенсор по умолчанию достаточно умен, чтобы сначала отображать все непрозрачные объекты, а затем отображать объекты, содержащие прозрачность, в порядке убывания расстояния от камеры (сначала визуализируя более дальние объекты). Это лучше всего работает для большинства сцен, и в частности там, где объекты движутся и могут непредсказуемо двигаться друг перед другом. К сожалению, в вашем пользовательском коде инициализации CC3Scene (который вы прислали мне в комментариях к вопросу) вы заменили секвенсор рисования по умолчанию на тот, который не упорядочивает прозрачные объекты в зависимости от расстояния. Если вы удалите это изменение, все будет работать правильно.

  2. Объекты, которые явно не упорядочены по расстоянию (как в части 1 выше), визуализируются в том порядке, в котором они добавляются в сцену. Поэтому вы также можете определить порядок рендеринга, убедившись, что объекты добавляются в вашу сцену в том порядке, в котором вы хотите их рендерить. Это может хорошо работать для статических моделей, таких как ваш первый персонаж (если вы измените его, чтобы добавить волосы после кожи).

  3. CC3Node также имеет свойство zOrder, которое позволяет вам явно переопределить порядок рендеринга, чтобы объекты с большим значением zOrder отображались раньше объектов с меньшими значениями zOrder. Это полезно, когда у вас есть статическая модель, компоненты которой не могут быть добавлены в порядке рендеринга, или для временного переопределения порядка рендеринга двух прозрачных объектов, которые могут проходить друг перед другом. Использование свойства zOrder действительно зависит от использования свойства drawingSequencer, которое его использует (это делает секвенсор рисования по умолчанию).

  4. Наконец, вы можете временно отключить тестирование глубины или маскирование при рендеринге определенных узлов, установив для свойств shouldDisableDepthTest и shouldDisableDepthMask значение YES на этих узлах.

person Bill Hollings    schedule 17.12.2014
comment
Спасибо Билл за проницательное решение. Я еще не совсем понимаю все ваши пункты выше, потому что я новичок в Cocos3D, и мне потребуется еще некоторое время, чтобы полностью понять ваше решение. Между тем, мне удалось решить проблему, используя ваше предложение выше. Еще раз, я очень ценю вашу помощь. - person Loc Pham; 18.12.2014