2016-09-23 77 views
1

我使用SceneKit生成一些自定義幾何體。這工作正常,但我正在努力尋找一種方法來包含自定義頂點屬性。具體來說,我期望每個頂點包含一個額外的SCNVector3。SceneKit中的自定義頂點屬性

我發現大量的例子,其利用shaderModifiers來包括依賴於定製均勻值GLSL /金屬代碼,而是跨越包括頂點屬性的方式還沒有來。這是可能與SceneKit,或者是我的思想倒退?

回答

3

似乎沒有辦法在着色器修改器中訪問自定義幾何來源。也就是說,如果您的數據符合float4,則可以通過SCNGeometrySourceSemanticColor傳遞該數據。

Fox示例代碼使用相同的技術爲草坪的葉片生成動畫。位移量被烘焙成灰度頂點顏色,如下圖所示。

Data baked into the vertex colors

最後以下着色器修改讀取_geometry.color價值,並確保將其重置爲純白色,這樣存儲的數據不會影響對象的最終顏色。

float offset = _geometry.color.x * (sin(1.2 * u_time + (_geometry.position.x+ _geometry.position.z)*4.0) + 0.5) * 0.02; 
_geometry.position.x += offset; 
_geometry.color.xyz = vec3(1.0); 
+0

所以黑色意味着沒有可能的位移,白色是最大位移。得到它了。但是「如果你的數據適合float3 ......」是什麼意思?這種限制在何處/如何/有什麼限制? – Confused

+1

我用'float4'而不是'float3'更新了我的答案。 「SCNGeometrySourceSemanticColor」預計會保存顏色數據。這是紅色,綠色,藍色和阿爾法最多4個浮標。您無法使用此技術來烘焙每個頂點需要更多信息的數據(例如變換)。 – mnuages

+0

迷人。我一直認爲法國人重視透明度;) – Confused

3

爲了使自定義形狀,可以使用SCNGeometrySource對象提供的頂點位置,法線和紋理座標使用緩衝器或Data對象滿值的屬性,然後通過你的幾何圖形來源的SCNGeometryinit(sources:elements:)初始化。

當您創建SCNGeometrySource時,將它與類似於GL/Metal頂點屬性的「語義」相關聯。要創建一個自定義的頂點屬性,只需給它一個自定義的語義。 (在ObjC,SCNGeometrySourceSemantic僅僅是NSString一個typedef,所以你可以提供自己的字符串名稱。在斯威夫特,SCNGeometrySource.Semantic是一個枚舉類結構,你可以擴展與String原始值創建新成員。)

要使用自定義着色器程序中的自定義頂點屬性,對於GL着色器使用setSemantic(_:forSymbol:options:),對金屬着色器使用(我認爲)handleBinding(ofBufferNamed:frequency:handler:)

+1

關於創建屬性的這部分內容肯定存在,但我並不是100%確定在自定義屬性的着色器(或着色器修改器)上。 @toyos可能知道那些... – rickster

+0

這與CGPath創建SKShapeNode&CAShapeLayer的方式類似(概念上),從某種意義上說,一旦創建任何對幾何體的更改,只能通過替換幾何體進行,即不能訪問頂點位置? – Confused

+0

@Confused:是的,有點。幾何來源(GL/Metal語言中的頂點緩衝區)被設計爲一次發送到GPU內存(當您將具有幾何圖形的節點放入場景中時),這樣您就不會在每幀中發送它們的性能成本。在SceneKit中,創建後可以讀取幾何源的內容,但不能編輯它們。 (雖然在渲染時[有金屬計算着色器](https://developer.apple.com/reference/scenekit/scngeometrysource/1522873-init),在GPU上有修改幾何的功能。) – rickster