2015-06-22 62 views
2

我想在OSX上的SceneKit中完全透明的平面上投下陰影。自從幾個小時以來,我一直在努力解決這個問題,並沒有找到任何解決方案。SceneKit:是否可以在透明對象上投射陰影?

我的目的是生成一個透明背景的幾個對象的屏幕截圖,只是在一個不可見的平面上的陰影。

你對我有什麼建議嗎?我可以用蘋果SceneKit做這個嗎?

我是否必須編寫自己的着色器,我可以使用shadermodifiers進行這項工作,還是可以使用內置的函數?

+0

任何運氣找到實際的辦法做這個? – jfisk

+0

你解決了嗎? – ooOlly

+0

有同樣的問題,有人解決了嗎? – larva

回答

1

我沒有回答你的問題,但是我有一個解決辦法:

  1. 渲染場景,並保持在圖像存儲
  2. 改變所有的材料在你的對象爲純黑色,無鏡面
  3. 平面和天空更改爲全白材料,燈白色
  4. 渲染場景到另一個圖像
  5. 在第二圖像,應用CIColorInvertCIMaskToAlpha核心圖像濾鏡
  6. 使用核心圖像將Alpha遮罩應用於第一個渲染。

您將得到一個帶有正確Alpha通道和透明陰影的圖像。您需要調整材料和燈光才能獲得想要的結果。

陰影可能在邊緣變得更亮,唯一的方法是將其渲染爲另一個圖像,並在「Mask to Alpha」步驟後將其填充爲黑色。

7

UPDATE:

我找人替代解決方案誰需要:

  1. 下創建3D模型白色平面,注意飛機的顏色必須是純白色。
  2. 將平面材質的混合模式設置爲SCNBlendModeMultiply
  3. 將飛機材質的輕型模型設置爲SCNLightingModelLambert

這是可行的,因爲任何顏色乘白色(1,,1,1)返回自己而蘭伯特光模型將不考慮定向光,所以飛機將永遠是背景顏色,看起來像透明。這種解決方案的另一個好處是你不需要改變燈光的陰影渲染模式。

對於習慣Xcode檢查員的人。

enter image description here enter image description here


SceneKit: What's New

首先,在你的模型下添加一個平面。然後阻止它寫入colorBuffer。 其次,將您的燈光模型的陰影渲染模式更改爲延遲。請注意,您必須使用可投射陰影的燈光。 plane's material inspector

light's attributes inspector

+0

只有在sceneKit視圖 – 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