Unity-Shader和OpenGL-Shader有什麼不同之處?

Unity可以寫shader,OpenGL的頂點著色器等等也可以寫shader,這兩個shader是同一種語言么?都是GLSL么?如果不同,他們間有什麼不同之處?

求大佬們解決一下我的困惑!!


Unity Shader使用的是ShaderLab語法,這是Unity自家創造的說明性語言,除了裡面內嵌著色器代碼(Cg/HLSL)外,最重要的是可以極大地方便程序員去設置著色器的屬性和狀態,如Properties語句塊中定義了著色器所需要的各種屬性(顏色、紋理等),這些屬性將會出現在屬性面板中,在Editor里輸入數據,而不用像傳統的Shader中需要編寫冗長的代碼來設置著色器的輸入和狀態。設計上類似於CgFX和Direct3D Effect(.FX)語言,它們都定義了一個著色器所需要的輸入數據和狀態,而不僅僅是著色器代碼。讓Unity開發者絕大多數時候只需要和Unity Shader打交道便可以編寫出色的遊戲效果。


語法不同,UnityShader是指ShaderLab嗎?

ShaderLab兼容GLSL和CG,ShaderLab實際上是Unity官方對各平台Shader再次封裝的一套Shader語言,略微新手友好一點,一些跨平台方案和實現細節都封裝好了,需要的時候直接使用。

然並卵的是移動平台性能並不是最佳。

最終還是會編譯成各個平台可用的Shader代碼。

糾結這個沒啥意義,學Shader最重要還是數學和物理。


兩種不同的東東,忘記dx和opengl把他當成一種完全不一樣的東西去看。可以認為UnityShader是 OpenGl-Shader DX-HLSL的封裝實現,在微軟系平台會編譯成DX-HLSL在其它設備會幹成GLSL。

有些東西雖然也用了HLSL的語法實際上也是他的封裝,有些語義如果沒有封裝的就不支持。


語法略有差別,在Unity中,Cg更高階更抽象一些,可以被翻譯成各種特定平台所支持的形式,

選中某個shader,點擊compile…你可以看到翻譯後的shader代碼

如果你的目標平台是OpenGL的,Unity會把Cg shader翻譯成OpenGL shader,最終調用OpenGL編譯成GPU可執行的二進位形式


如多位回答者所言,unity使用shaderlab,長的更像cg,但並不是cg。實則是對我們所說的shader的再次封裝,便於用戶使用。好處有很多,比如說你不用同時和多個文件打交道了,你只用管unityshader,它會幫你解決大部分煩惱。

unity shader,並不等同於我們說的頂點著色器啊片元著色器啊這樣的shader(雖然它可以內嵌這些代碼)。

opengl的話一般用glsl語言,也可以用cg語言,我不知道能不能用hlsl(畢竟cg是通用的而hlsl是支持direx的)。

如果題主想要學習shader,建議不要直接使用shaderlab。親自和各項文件打交道,走一遍cg或者glsl的路,會更能理解shader做了什麼。如果題主只是想要多快好省實現東西,那麼shaderlab會如你所願。


不同語言,unity shader 用的是cg, 編譯的時候會翻譯成不同平台的語言。基本上寫法沒什麼區別,但是也會有某種語言特性其他平台不支持的情況。


Unity用的是Cg/HLSL,但是也兼容GLSL只是對平台有一定限制


推薦閱讀:

Shader 在現在圖形管線中可以負責多少部分?
如何評價CSDN學院姜雪偉的《3D遊戲引擎高端實戰培訓》課程?
在 OS X 下怎麼寫新版本的 OpenGL?
初學OpenGL 用的是OpenGL2.1加MFC 但是感覺好難啊!難度是兩方面的啊?

TAG:OpenGL | Unity遊戲引擎 | shader |