Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

CanvasItem 著色器

畫布組件著色器用於繪製Godot中的所有二維元素. 這包括從畫布組件繼承的所有節點, 以及所有圖形化使用者介面元素.

畫布元件著色器比空間著色器包含更少的內建變數和功能, 但它們與頂點, 片段和光處理器功能保持相同的基本結構.

渲染模式

渲染模式

說明

blend_mix

混合混合模式(Alpha 為透明度),預設。

blend_add

疊加混合模式。

blend_sub

減法混合模式。

blend_mul

乘法混合模式。

blend_premul_alpha

預乘 Alpha 混合模式。

blend_disabled

禁用混合,值(包括 Alpha)會按原樣寫入。

unshaded

結果只使用反照率。材質中不會發生照明/陰影。

light_only

僅在光通過時繪製.

skip_vertex_transform

VERTEX needs to be transformed manually in vertex function.

world_vertex_coords

VERTEX is modified in world coordinates instead of local.

內建

標記為 "in" 的值是唯讀的. 標記為 "out" 的值是可以選擇寫入的, 不一定包含合理的值. 標記為 "inout" 的值提供一個合理的預設值, 並且可以選擇寫入. 取樣器不是寫入的物件, 它們沒有被標記.

定數

全域內建的功能隨處可見, 包括自訂功能.

內建

說明

in float TIME

引擎啟動後的全域時間, 以秒為單位(始終為正數). 這取決於翻轉(rollover)設定(預設為3600秒). 不受 time_scale 或暫停的影響, 但可以通過呼叫 VisualServer.set_shader_time_Scale() 來覆蓋 TIME 變數的時標, 並將所需的時標因數作為參數( 1.0 為預設值).

in float PI

一個“PI”常數(“3.141592”)。圓的周長與其直徑的比率以及半圈的弧度數。

in float TAU

一個“TAU”常數(“6.283185”)。相當於“PI * 2”和完整的弧度數。

in float E

一個“E”常數(“2.718281”)。歐拉數和自然對數的底數。

頂點內建

頂點資料( VERTEX )是以局部空間(像素座標, 相對於相機)呈現. 如果不寫入, 這些值將不會被修改, 並按其來時的樣子傳遞.

使用者可以禁用內建的modelview變換(以後仍然會發生投影), 並通過以下程式碼手動完成:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

    VERTEX = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy;
}

其他內建程式, 如UV和COLOR, 如果沒有修改, 也會傳遞給片段函式.

對於產生實體,INSTANCE_CUSTOM變數包含實例自訂資料. 使用粒子時, 此資訊通常是:

  • x:旋轉角度,單位為弧度。

  • y:生命週期的階段(0 到 1)。

  • z:動畫影格。

內建

說明

in mat4 MODEL_MATRIX

局部空間到世界空間的變換。世界空間是您通常在編輯器中使用的座標。

in mat4 CANVAS_MATRIX

世界空間到畫布空間的變換。在畫布空間中,原點是螢幕的左上角,座標範圍從 (0, 0) 到視窗大小。

in mat4 SCREEN_MATRIX

畫布空間到剪輯空間。在剪輯空間中,座標範圍從 (-1, -1) 到 (1, 1)。

in int INSTANCE_ID

產生實體的實例ID.

in vec4 INSTANCE_CUSTOM

實例自訂資料.

in bool AT_LIGHT_PASS

if x else

in vec2 TEXTURE_PIXEL_SIZE

Normalized pixel size of default 2D texture. For a Sprite2D with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 VERTEX

Vertex, in local space.

in int VERTEX_ID

頂點緩衝區中目前頂點的索引。

inout vec2 UV

標準化紋理座標。範圍從 0 到 1。

inout vec4 COLOR

來自頂點原語的顏色.

inout float POINT_SIZE

點繪圖的點大小.

片段內建

Certain Nodes (for example, Sprite2Ds) display a texture by default. However, when a custom fragment function is attached to these nodes, the texture lookup needs to be done manually. Godot provides the texture color in the COLOR built-in variable multiplied by the node's color. To read the texture color by itself, you can use:

COLOR = texture(TEXTURE, UV);

Similarly, if a normal map is used in the CanvasTexture, Godot uses it by default and assigns its value to the built-in NORMAL variable. If you are using a normal map meant for use in 3D, it will appear inverted. In order to use it in your shader, you must assign it to the NORMALMAP property. Godot will handle converting it for use in 2D and overwriting NORMAL.

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

內建

說明

in vec4 FRAGCOORD

像素中心的座標。在螢幕空間中,xy 表示視窗中的位置,如果沒有用 DEPTH,則 z 表示片段深度。原點位於左下角。

in vec2 SCREEN_PIXEL_SIZE

單個像素的大小. 等於解析度的倒數.

in vec2 POINT_COORD

所繪製點的座標。

sampler2D TEXTURE

預設的2D紋理.

in vec2 TEXTURE_PIXEL_SIZE

Normalized pixel size of default 2D texture. For a Sprite2D with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in bool AT_LIGHT_PASS

if x else

sampler2D SPECULAR_SHININESS_TEXTURE

該物件的鏡面光澤紋理。

in vec4 SPECULAR_SHININESS

鏡面光澤顏色,從紋理取樣。

in vec2 UV

來自頂點功能的UV.

in vec2 SCREEN_UV

螢幕目前像素的UV座標.

sampler2D SCREEN_TEXTURE

在 Godot 4 中移除。請改用 sampler2Dhint_screen_texture

inout vec3 NORMAL

從 ** NORMAL_TEXTURE ** 中正常讀取. 可寫的.

輸入sampler2D NORMAL_TEXTURE

預設 2D 法線紋理。

out vec3 NORMAL_MAP

配置用於三維的法線貼圖, 以便在二維中使用. 如果使用, 則覆蓋 法線 .

out float NORMAL_MAP_DEPTH

用於縮放的法線貼圖深度.

inout vec2 VERTEX

法向量, 在視圖空間中.

inout vec2 SHADOW_VERTEX

與 VERTEX 相同,但可以寫入來改變陰影。

inout vec3 LIGHT_VERTEX

與“VERTEX”相同,但可以寫入來改變照明。 Z 分量代表高度。

inout vec4 COLOR

Color from vertex function multiplied by the TEXTURE color. Also output color value.

內建燈光

光處理器函式在 Godot 4.x 中的運作方式與在 Godot 3.x 中的工作方式不同。在 Godot 4.x 中,所有照明都是在常規繪製過程中完成的。換句話說,Godot 不再為每個光重新繪製物體。

光照處理器功能在 2D 中與在 3D 中工作不同。在 CanvasItem 著色器中,這個著色器會為被繪製的物件呼叫一次,然後再為每一束接觸場景中該物體的光呼叫一次。如果您不希望該物件發生任何光傳遞,請使用 render_mode unshaded。如果您只想讓光通過該物件,使用 render_mode light_only;當您只想讓被光覆蓋的物件可見時,這是非常有用的。

If you define a light function it will replace the built in light function, even if your light function is empty.

以下是考慮 CanvasItem 法線貼圖的燈光著色器範例:

void light() {
  float cNdotL = max(0.0, dot(NORMAL, LIGHT_DIRECTION));
  LIGHT = vec4(LIGHT_COLOR.rgb * COLOR.rgb * LIGHT_ENERGY * cNdotL, LIGHT_COLOR.a);
}

內建

說明

in vec4 FRAGCOORD

像素中心的座標。在螢幕空間中,xy 表示視窗中的位置,如果沒有用 DEPTH,則 z 表示片段深度。原點位於左下角。

in vec3 NORMAL

輸入

in vec4 COLOR

Input Color. This is the output of the fragment function.

in vec2 UV

來自頂點函式的UV, 相當於片段函式中的UV.

sampler2D TEXTURE

CanvasItem使用的目前紋理.

in vec2 TEXTURE_PIXEL_SIZE

Normalized pixel size of TEXTURE. For a Sprite2D with a TEXTURE of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

螢幕目前像素的UV座標.

in vec2 POINT_COORD

點精靈的UV.

in vec4 LIGHT_COLOR

Color of Light multiplied by Light's texture.

in float LIGHT_ENERGY

燈光的能量乘數。

in vec3 LIGHT_POSITION

燈光在螢幕空間中的位置。如果使用的是 DirectionalLight2D,則始終為 vec3(0,0,0)

in vec3 LIGHT_DIRECTION

燈光在螢幕空間中的方向。

in bool LIGHT_IS_DIRECTIONAL

如果 true 代表光照通道.

in vec3 LIGHT_VERTEX

world_position 可用於頂點函式或片段函式.

inout vec4 LIGHT

Output color for this Light.

in vec4 SPECULAR_SHININESS

鏡面光澤度,在物件紋理中設定。

out vec4 SHADOW_MODULATE

將此時投射的陰影乘以該顏色。

函式

也實作了一些附加函式來對自動產生的有符號距離場紋理進行取樣。這些函式可用於 CanvasItem 著色器的片段和燈光函式。

帶符號的距離場是從場景中存在的 class_LightOcclusionr2D 節點產生的,並且啟用了 SDF Collision 屬性(這是預設)。有關更多信息,請參閱 2D 燈光和陰影 <doc_2d_lights_and_shadows_setting_up_shadows>` 檔案。

函式

說明

float texture_sdf (vec2 sdf_pos)

執行2D紋理讀取。

vec2 texture_sdf_normal (vec2 sdf_pos)

Calculates a normal from the SDF texture.

vec2 sdf_to_screen_uv (vec2 sdf_pos)

將 SDF 轉換為螢幕 UV。

vec2 screen_uv_to_sdf (vec2 uv)

轉換螢幕UV為SDF。