2017-03-21 39 views
0

我試圖模擬SceneKit中的深度貼圖,並且我對3D編程非常陌生。我已經在XY中創建了一個三維網格,其中包含Z中的海洋深度。計劃是使用片段着色器在顏色之間縮放此Z值以創建一個漂亮的地圖無法訪問片段着色器中的_geometry變量

在着色器的文檔中,來自以前着色器的值在稍後的着色器中可用。特別是,第一個(幾何)着色器具有名爲_geometry的結構,其中包含模型空間中的頂點。但是,由於某些原因,在我的片段着色器中沒有定義,當我嘗試使用它時出現錯誤。

失敗編譯的錯誤輸出顯示其他值可用,如_surface和_light,但不包含_geometry。

我試圖從_surface.position vec3轉換回模型空間,但恐怕我的轉換已經超出了我的深度。根據這個值是考慮空間的文件,所以我嘗試:

vec4 model4 = vec4(_surface.position, 1.0); 
vec4 model_position = u_inverseModelViewTransform * model4; 
if (model_position.z ..... 

但這不是給我的Z. u_inverseModelViewProjectionTransform的正確的價值觀似乎不存在,要麼。

我也試着寫一個幾何着色器是什麼也沒做只是爲了確保_geometry存在於該着色並希望有幾何着色器將包括在我的片段着色器_geometry但沒有喜悅

我的問題是:我如何到達片段着色器中的_geometry變量,或者缺少該變量,如何將_surface.position轉換回模型空間?

感謝,

回答

2

_geometry結構是隻在頂點着色器可用。

該文檔似乎表明u_inverseModelViewProjectionTransform應該作爲一個統一變量存在,但我還沒有能夠使用它。

作爲一種解決方法,我一直在使用片段着色器中的以下內容來從視圖到模型空間。

vec4 model_position = u_inverseModelTransform * u_inverseViewTransform * model4; 

編輯:

Xcode中似乎並不轉儲整個SceneKit着色器編譯時失敗了,幸好你仍然可以看到通過GPU調試UI的完整代碼。原來你也可以訪問片段着色器中的commonprofile_node結構。 以下是更好的解決方案。

vec4 model_position = scn_node.inverseModelViewTransform * model4; 

祝你好運!

+0

第一個建議工作恢復到正確的Z值。我試了第二次,但得到了關於scn_node沒有被定義的錯誤。也許它沒有在SceneKit着色器中定義?我不知道GPU調試用戶界面 - 我假設它只有在設備上運行時纔可用。謝謝。 – danielweberdlc

+0

呃,你是對的,只是試圖在模擬器中運行第二個解決方案......它不起作用。這是一個金屬vs OpenGL的問題; SceneKit爲每個3D圖形框架提供了不同的着色器。 Metal SceneKit着色器在片段着色器中具有'scn_node'結構,而OpenGL(由模擬器使用)不具有。 – lock

相關問題