由於某些需求,需要在蘋果OS x系統下展示一組點雲,準備使用蘋果官方的三維顯示控制項來完成這一功能。場景點雲作為離散的點, 如果每個點以SCNnode的形式加入場景中,則回造成過大的記憶體消耗,筆者電腦下,單個場景展示到1w點時記憶體就崩潰了。所以準備通過 修改單個node的shader屬性,實現自定義的 ...
由於某些需求,需要在蘋果OS x系統下展示一組點雲,準備使用蘋果官方的三維顯示控制項來完成這一功能。場景點雲作為離散的點,
如果每個點以SCNnode的形式加入場景中,則回造成過大的記憶體消耗,筆者電腦下,單個場景展示到1w點時記憶體就崩潰了。所以準備通過
修改單個node的shader屬性,實現自定義的形狀,這樣可以節省記憶體,還可以同時展示多個場景。查詢了蘋果的官方api文檔,https://developer.apple.com/documentation/scenekit/scnshadable/1523348-shadermodifiers
說實話,的確沒怎麼看懂,以為看懂了寫出來還是不對。搜索了一下傻瓜視頻。才實現了基本顏色的功能。
(原本手冊是非常管用的,只是不適合我這種英文不太好的菜鳥)
SCNProgram
通過使用GLSL(OpenGL Shading Language )或者Metal shading language進行重寫。當你希望完全替換Scene Kit的原來的變換處理的時候,如果僅僅是簡單的修該和替換的話,官方建議使用shaderModifiers屬性,插入需要修改的屬性,同樣使用上面提到的兩種方式。
修改vertexFunctionName和fragmentFunctionName定義預編譯用的shader function,修改vertexShader和fragmentShader屬性,提供OpenGL或者OpenGLES源碼。
總之使用SCNProgram的許可權比較大,但是需要定義的東西比較多。聽從官方的建議,準備嘗試下shaderModifiers屬性
shaderModifiers
深度可以形成較複雜的幾何形狀,模擬出較為複雜的真實錶面效果,增加較為藝術的光照效果,通過對每個像素的後續處理形成特殊效果。
這裡定義的屬性不同於SCNProgram,是額外追加到SceneKit的shader上的,完好保留原來的系統。
你可以將屬性附加到SCNGeometry 或者SCNMaterial對象上,然後鏈接到shaderModifiers上。