Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
建立 Godot 伺服器¶
本文件解釋了Godot的著色語言和GLSL之間的區別, 並提供了有關如何將著色器從其他來源(如Shadertoy和The Book of Shaders)遷移到Godot著色器的實用建議.
關於Godot的著色語言的詳細資訊, 請參考 Shading Language .
GLSL¶
Godot使用基於GLSL的著色語言, 增加了一些生活品質特徵. 因此,GLSL中提供的大多數功能都可以使用Godot的著色語言.
著色器程式¶
在GLSL中, 每個著色器使用一個單獨的程式. 你有一個用於頂點著色器的程式和一個用於片段著色器的程式. 在Godot中, 你有一個包含 vertex
和/或 fragment
函式的單一著色器. 如果你只選擇寫一個,Godot會提供另一個.
Godot允許通過在一個檔中定義片段和頂點著色器來共用uniform的變數和函式. 在GLSL中, 頂點和片段程式不能共用變數, 除非是使用varyings的時候.
頂點屬性¶
在GLSL中, 你可以使用屬性來傳遞每個頂點的資訊, 並且可以靈活地傳遞你想要的資訊, 或多或少. 在Godot中, 你有一系列的輸入屬性, 包括 VERTEX
(座標), COLOR
, UV
, UV2
, NORMAL
. 完整的列表, 請參見 Shading language reference .
gl_Position¶
gl_Position
接收在頂點著色器中指定的頂點的最終座標. 它是由使用者在裁剪空間中指定的. 通常, 在GLSL中, 模型空間的頂點位置是通過一個名為 position
的頂點屬性來傳遞的, 你可以手動處理從模型空間到裁剪空間的轉換.
在Godot中, VERTEX
指定了 vertex
函式開始時在模型空間的頂點位置. 在使用者定義的 vertex
函式運作後,Godot也會處理最終轉換到裁剪空間的過程. 如果你想跳過從模型空間到視圖空間的轉換, 你可以將 render_mode
設定為 skip_vertex_transform
. 如果你想跳過所有的轉換, 將 render_mode
設定為 skip_vertex_transform
並將 PROJECTION_MATRIX
設定為 mat4(1.0)
, 以便使從視圖空間到裁剪空間的最終轉換失效.
Varying¶
varyings是一種變數, 可以從頂點著色器傳遞到片段著色器. 在現代GLSL(3.0及以上版本)中, 變數是通過 in
和 out
關鍵字來定義的. 一個從頂點著色器出來的變數在頂點著色器中用 out
定義, 在片段著色器中用 in
定義.
主要¶
在GLSL中, 每個著色器程式看起來都像是一個獨立的C風格程式. 因此, 主要入口點是 main
. 如果要複製頂點著色器, 請將 main
重命名為 vertex
, 如果要複製片段著色器, 請將 main
重命名為 fragment
.
宏¶
Godot 著色器預處理器<doc_shader_preprocessor>` 支援以下巨集: * #define
/ #undef
* #if
, #elif
, #else ``, ``#endif
, define()
, #ifdef
, #ifndef
* #include
(僅限``.gdshaderinc`` 檔案並帶有最大深度為25) * #pragma disable_preprocessor
,停用檔案其餘部分的預處理
變數¶
GLSL 有許多內建的硬編碼變數。這些變數不是 uniform,因此它們不能從主程式中編輯。
變數 |
型別 |
等價物 |
說明 |
---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
每個像素的輸出顏色. |
gl_FragCoord |
vec4 |
FRAGCOORD |
用於全屏四邊形. 對於較小的四邊形, 使用UV. |
gl_Position |
vec4 |
VERTEX |
頂點的位置, 從頂點著色器輸出. |
gl_PointSize |
浮點數 |
POINT_SIZE |
Point原語的大小. |
gl_PointCoord |
vec2 |
POINT_COORD |
繪製Point基元時在點上的位置. |
gl_FrontFacing |
bool |
FRONT_FACING |
如果原始的正面, 則為真. |
座標¶
GLSL中的 gl_FragCoord
和Godot著色語言中的 FRAGCOORD
使用相同的坐標系. 如果在Godot中使用UV, 則y座標將顛倒翻轉.
精度¶
在GLSL中,你可以用 precision
關鍵字在著色器的頂部定義一個給定型別的精度(float 或 int)。在 Godot 中,你可以在定義變數時將精度限定詞 lowp
、mediump
、highp
放在型別前,根據需要設定單個變數的精度。更多資訊請參見:ref:`著色器語言 <doc_shading_language>`參考。
Shadertoy¶
Shadertoy 是一個網站, 它使編寫片段著色器和建立 純正的魔法 變得容易.
Shadertoy 並沒有讓使用者完全控制著色器。它處理所有的輸入和 uniform,只讓使用者編寫片段著色器。
型別¶
Shadertoy使用的是webgl規範, 所以它運作的GLSL版本略有不同. 然而, 它仍然有常規的型別, 包括常數和宏.
mainImage¶
Shadertoy著色器的主要入口點是 mainImage
函式. mainImage
有兩個參數, fragColor
和 fragCoord
, 分別對應Godot中的 COLOR
和 FRAGCOORD
. 這些參數在Godot中是自動處理的, 所以你不需要自己把它們作為參數. 移植到Godot時, mainImage
函式中的任何內容都應複製到 fragment
函式中.
變數¶
為了讓編寫片段著色器變得簡單明瞭,Shadertoy為你處理了從主程式傳遞到片段著色器中的許多有用資訊. 其中有一些在Godot中沒有對應的資訊, 因為Godot選擇不在預設情況下提供這些資訊. 這沒關係, 因為Godot讓你有能力製作自己的 uniform。對於那些等價物被列為 "Provide with Uniform" 的變數, 使用者有責任自己建立該uniform . 該描述給了讀者一個提示, 告訴他們可以傳入什麼作為替代物.
變數 |
型別 |
等價物 |
說明 |
---|---|---|---|
fragColor |
out vec4 |
COLOR |
每個像素的輸出顏色. |
fragCoord |
vec2 |
FRAGCOORD.xy |
用於全屏四邊形. 對於較小的四邊形, 使用UV. |
iResolution |
vec3 |
1.0 / SCREEN_PIXEL_SIZE |
也可以手動傳遞. |
iTime |
浮點數 |
TIME |
著色器啟動後的時間. |
iTimeDelta |
浮點數 |
提供Uniform |
渲染前一影格的時間. |
iFrame |
浮點數 |
提供Uniform |
影格號. |
iChannelTime[4] |
浮點數 |
提供Uniform |
自該特定紋理開始的時間。 |
iMouse |
vec4 |
提供Uniform |
滑鼠在像素座標中的位置. |
iDate |
vec4 |
提供Uniform |
目前日期, 以秒為單位表示. |
iChannelResolution[4] |
vec3 |
1.0 / TEXTURE_PIXEL_SIZE |
特殊紋理的解析度. |
iChanneli |
Sampler2D |
TEXTURE |
Godot只提供一個內建;使用者可以製作更多. |
座標¶
fragCoord
的行為與 gl_FragCoord
相同 GLSL 和Godot中的 FRAGCOORD
.
著色之書¶
與 Shadertoy 類似,The Book of Shaders 提供了在網路瀏覽器中存取片段著色器的機會,使用者可以與之互動,但只限於編寫片段著色器程式碼,其中有一組傳入的 uniform 列表,不能新增額外的 uniform。
有關將著色器移植到各種框架的進一步幫助,The Book of Shaders在各種框架中運作著色器時提供了一個 page .
型別¶
The Book of Shaders使用webgl規範, 因此它運作的GLSL略有不同. 但是, 它仍然具有常規型別, 包括常數和宏.
主要¶
Book of Shaders片段著色器的入口點是 main
, 就像在GLSL中一樣. 使用著色器 main
函式編寫的所有內容都應該複製到Godot的 fragment
函式中.
變數¶
著色書比Shadertoy更接近普通GLSL. 它也比Shadertoy實施更少的制服.
變數 |
型別 |
等價物 |
說明 |
---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
每個像素的輸出顏色. |
gl_FragCoord |
vec4 |
FRAGCOORD |
用於全屏四邊形. 對於較小的四邊形, 使用UV. |
u_resolution |
vec2 |
1.0 / SCREEN_PIXEL_SIZE |
也可以手動傳遞. |
u_time |
浮點數 |
TIME |
著色器啟動後的時間. |
u_mouse |
vec2 |
提供Uniform |
滑鼠在像素座標中的位置. |
座標¶
Shaders使用相同的坐標系 GLSL.