2015-06-22 1 views
2

Я пытаюсь бросить тень на абсолютно прозрачную плоскость в SceneKit на OSX. Я борюсь с этой проблемой с нескольких часов и не прихожу к какому-либо решению.SceneKit: Можно ли наложить тень на прозрачный объект?

My Purpose предназначен для создания скриншота из нескольких объектов с прозрачным фоном и просто тени на невидимом самолете.

Есть ли у вас какие-либо предложения для меня, как я могу сделать это с яблоками SceneKit?

Должен ли я запрограммировать свой собственный шейдер, могу ли я сделать эту работу с shadermodifiers или могу ли я использовать встроенную функциональность?

+0

любая удача найти фактический путь к сделай это? – jfisk

+0

Вы разрешаете это? – ooOlly

+0

имеют такую ​​же проблему, кто-нибудь ее разрешил? – larva

ответ

1

У меня нет ответа на ваш вопрос, но у меня есть обходной путь:

  1. Визуализировать сцену и сохранить изображение в памяти
  2. Измените все материалы вашего объекта для чистого черного, нет зеркальная
  3. Изменение плоскости и небо, чтобы полностью белый материал, огни на белом
  4. рендер сцены к другому изображению
  5. на втором изображении, применить CIColorInvert и CIMaskToAlpha Фильтры основного изображения
  6. Использование основного изображения применяет альфа-маску к первому рендерингу.

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

Тень может стать светлее по краям, и единственный способ сделать это - это сделать еще одно изображение и заполнить его черным после шага Маска до Альфы.

7

UPDATE:

я найти альтернативное решение для тех, кто нуждается:

  1. создать белый самолет под 3D модели, обратите внимание, что цвет плоскости должен быть чистым белым.
  2. комплект смешанный режим материала самолета до SCNBlendModeMultiply.
  3. комплект легкая модель материала самолета до SCNLightingModelLambert.

Это работает, потому что любой цвет размножается белым цветом (1, 1, 1) возвращается сам. Модель lambert light не учитывает направленный свет. Поэтому плоскость всегда будет цветом фона, который будет выглядеть прозрачным. Другим преимуществом этого решения является то, что вам не нужен режим рендеринга теней изменения света.

Для людей, которые использовали инспектор Xcode.

enter image description here enter image description here


Согласно SceneKit: What's New.

Сначала добавьте самолет под модель. Затем запретите запись в colorBuffer. Во-вторых, измените режим рендеринга тени вашей модели на отложенный. Обратите внимание, что вы должны использовать свет, который может отбрасывать тени. plane's material inspector

light's attributes inspector

+0

Это работает только в том случае, если на сцене есть набор фона. Вид кадра – jfisk

+0

работает отлично. Благодаря! – Claus

+0

Не могли бы вы предоставить код – Nassif

4

Жирная Го, ваше решение работает. Здесь решение в коде:

Конфигурация источника света:

light.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4) 
light.shadowMode = .deferred 

И для пола (т.е. SCNFloor под вашими объектами.):

material.diffuse.contents = UIColor.white 
material.colorBufferWriteMask = SCNColorMask(rawValue: 0) 
+1

Отлично! Вы также должны убедиться, что ваш самолет не может отбрасывать тени. – ooOlly