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及以上版本)中, 變數是通過 inout 關鍵字來定義的. 一個從頂點著色器出來的變數在頂點著色器中用 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 中,你可以在定義變數時將精度限定詞 lowpmediumphighp 放在型別前,根據需要設定單個變數的精度。更多資訊請參見:ref:`著色器語言 <doc_shading_language>`參考。

Shadertoy

Shadertoy 是一個網站, 它使編寫片段著色器和建立 純正的魔法 變得容易.

Shadertoy 並沒有讓使用者完全控制著色器。它處理所有的輸入和 uniform,只讓使用者編寫片段著色器。

型別

Shadertoy使用的是webgl規範, 所以它運作的GLSL版本略有不同. 然而, 它仍然有常規的型別, 包括常數和宏.

mainImage

Shadertoy著色器的主要入口點是 mainImage 函式. mainImage 有兩個參數, fragColorfragCoord, 分別對應Godot中的 COLORFRAGCOORD . 這些參數在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.