2017-01-01 71 views
4

基本上,我想渲染一個圍繞立方體的輪廓。要做到這一點,我想我可以使用SCNTechnique它具有以下渲染通道:如何使用SCNTechnique模板?

  1. 渲染立方體正常,也寫他們佔據的像素到模板緩存。
  2. 如果在第一遍中不與模板相交,則渲染略大的立方體。

問題是,SCNTechnique中模具的文檔非常稀疏,我無法確切知道如何使用它。

我已經成功繪製輪廓線,首先繪製較大的「輪廓立方體」,先關閉深度測試,然後再繪製常規立方體,而且這種方法運行得很好,但是我想使用模板代替其他併發症用這種方法。

在試圖得到它使用模板緩衝的工作,我第一遍的stencilStates樣子(與我爲什麼認爲沿着我所需要的屬性):

clear = YES // To clear the buffer from last 
enable = YES // To write to the buffer 
behavior: 
    writeMask = 1  // Use bit 1 
    function = always // Always write to stencil regardless? 

第二遍的stencilStates樣子:

clear = NO // Keep the buffer from last step 
enable = NO // Don't write to the buffer (only read?) 
behavior: 
    readMask = 1  // Use bit 1 
    fail  = keep // Not sure if these... 
    pass  = zero // ...should be the other way round 

對於模板緩衝區行爲,有相當a few other properties,但我不知道我需要什麼以及如何使用它們。我也不確定模板緩衝區是否需要列爲每個傳遞的輸入或輸出?

編輯1:這裏的正是我要找來實現,通過繪製藍色,大輪廓立方體呈現先不寫深度緩存:

Cube with blue outline

如果WASN對於在這個莊園中繪製的一些副作用,我會留下這樣的實現,但是我認爲模板方法可以避免這些副作用,我認爲無論如何知道如何使用它們都是有用的!

編輯2:我一直在玩,試圖直接使用OpenGL(在C中)產生類似的效果。我並不假裝完全理解模具是如何工作的(我基本上借用了code from a tutorial),但是這些命令產生了我試圖實現的東西。

之前繪製的主要立方體,寫模板緩存:

glStencilFunc(GL_EQUAL, 0, 0xFF); // Pass test if stencil value is 0 
glStencilMask(0x00); // Don't write anything to stencil buffer 

glStencilFunc(GL_ALWAYS, 1, 0xFF); // Set any stencil to 1 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
glStencilMask(0xFF); // Write to stencil buffer 
glClear(GL_STENCIL_BUFFER_BIT); // Clear stencil buffer (0 by default) 

繪製主立方體後,並繪製較大的外形立方體,檢測到當前的模板緩存之前因此,問題是如何使用SCNTechnique來實現上述目標。

+0

對不起,要問一個視覺問題,但是您可以顯示您正在尋找的輪廓效果類型的圖像/鏡頭嗎?使用關於多維數據集和輪廓和卡通效果的關鍵字搜索谷歌圖像,直到找到您喜歡/想要/渴望的東西。 – Confused

+0

@Confused當然,我編輯了我想要實現的東西(但是用模具)。謝謝參觀! – Robert

+0

我剛剛在最寬鬆的OpenGL討論它們的讀法中查看了模板緩衝區。我不確定他們是否正確。他們可以使用,因爲他們確實有掩蔽,但反轉掩蔽也是如此,白色骰子可以做到圍繞它的藍色框。我的直覺(那是一個天真的直覺)是一個像素着色器,它以某種方式知道骰子的邊緣可以在骰子周圍畫出更好,更平滑的這種類型的輪廓。但我不知道該怎麼做,或者甚至可以在SceneKit中使用。 – Confused

回答

0

您可以使用SCNTechnique繪製輪廓。這個想法是將對象遮罩繪製到緩衝區,模糊遮罩的一個通道,然後將其與原始渲染幀相結合。該組合着色器會檢查模糊的通道,而非模糊的通道則只會渲染對象外部的輪廓。

在這裏有一個例子在節點周圍繪製一道光暈:https://github.com/laanlabs/SCNTechniqueGlow 您應該可以對其進行修改以獲得所需的效果。