シェーディング言語

はじめに

Godotは、GLSL ES 3.0と同様のシェーディング言語を使用します。ほとんどのデータ型と関数がサポートされており、残りのいくつかのデータ型は今後追加される可能性があります。

既にGLSLに精通している場合、Godot Shader Migration Guide は、通常のGLSLからGodotのシェーディング言語への移行を支援するリソースです。

データ型

ほとんどのGLSL ES 3.0データ型がサポートされています:

タイプ(型) 説明
void Voidデータ型。何も返さない関数にのみ有用です。
bool Boolデータ型には、true または false のみを含めることができます。
bvec2 Bool値の2要素ベクトル。
bvec3 Bool値の3要素ベクトル。
bvec4 Bool値の4要素ベクトル。
int 符号付きスカラー整数。
ivec2 符号付き整数の2要素ベクトル。
ivec3 符号付き整数の3要素ベクトル。
ivec4 符号付き整数の4要素ベクトル。
uint 符号なしスカラー整数。負の数を含めることはできません。
uvec2 符号なし整数の2要素ベクトル。
uvec3 符号なし整数の3要素ベクトル。
uvec4 符号なし整数の4要素ベクトル。
float 浮動小数点スカラー。
vec2 浮動小数点値の2要素ベクトル。
vec3 浮動小数点値の3要素ベクトル。
vec4 浮動小数点値の4要素ベクトル。
mat2 列優先順の2x2マトリックス。
mat3 列優先順の3x3マトリックス。
mat4 列優先順の4x4マトリックス。
sampler2D floatとして読み取られる2Dテクスチャをバインドするためのサンプラータイプ。
isampler2D 符号付き整数として読み取られる2Dテクスチャをバインドするためのサンプラータイプ。
usampler2D 符号なし整数として読み取られる2Dテクスチャをバインドするためのサンプラータイプ。
sampler2DArray floatとして読み取られる2Dテクスチャ配列をバインドするためのサンプラータイプ。
isampler2DArray 符号付き整数として読み取られる2Dテクスチャ配列をバインドするためのサンプラータイプ。
usampler2DArray 符号なし整数として読み取られる2Dテクスチャ配列をバインドするためのサンプラータイプ。
sampler3D floatとして読み取られる3Dテクスチャをバインドするためのサンプラータイプ。
isampler3D 符号付き整数として読み取られる3Dテクスチャをバインドするためのサンプラータイプ。
usampler3D 符号なし整数として読み取られる3Dテクスチャをバインドするためのサンプラータイプ。
samplerCube Cubemapsをバインドするためのサンプラータイプ。floatとして読み込まれます。

キャスト

GLSL ES 3.0と同様に、同じサイズで異なるタイプのスカラーとベクトル間の暗黙的なキャストは許可されていません。異なるサイズの型のキャストも許可されていません。変換は、コンストラクターを介して明示的に実行する必要があります。

例:

float a = 2; // invalid
float a = 2.0; // valid
float a = float(2); // valid

デフォルトの整数定数は符号付きなので、符号なしに変換するには常にキャストが必要です:

int a = 2; // valid
uint a = 2; // invalid
uint a = uint(2); // valid

メンバー

ベクタータイプの個々のスカラーメンバーには、"x"、"y"、"z"、"w" メンバーを介してアクセスします。あるいは、"r"、"g"、"b" および "a" を使用しても機能し、同等です。ニーズに最適なものを使用してください。

行列の場合、m[row][column] インデックス構文を使用して各スカラーにアクセスするか、m[idx] を使用して行インデックスでベクトルにアクセスします。たとえば、mat4のオブジェクトのy位置にアクセスするには、m[3][1] を使用します。

構築

ベクトル型の構築は常に代入する必要があります:

// The required amount of scalars
vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
// Complementary vectors and/or scalars
vec4 a = vec4(vec2(0.0, 1.0), vec2(2.0, 3.0));
vec4 a = vec4(vec3(0.0, 1.0, 2.0), 3.0);
// A single scalar for the whole vector
vec4 a = vec4(0.0);

行列タイプの構築には、行列と同じ次元のベクトルが必要です。matx(float) 構文を使用して対角行列を構築することもできます。したがって、mat4(1.0) は単位行列です。

mat2 m2 = mat2(vec2(1.0, 0.0), vec2(0.0, 1.0));
mat3 m3 = mat3(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0));
mat4 identity = mat4(1.0);

行列は、別の次元の行列から構築することもできます。次の2つのルールがあります。小さいマトリックスから大きいマトリックスを作成する場合、追加の行と列は単位マトリックスの値に設定されます。小さいマトリックスが大きいマトリックスから構築される場合、大きいマトリックスの左上のサブマトリックスが使用されます。

mat3 basis = mat3(WORLD_MATRIX);
mat4 m4 = mat4(basis);
mat2 m2 = mat2(m4);

Swizzling

結果が別のベクトル型(またはスカラー)である限り、任意の順序で要素の任意の組み合わせを取得することが可能です。これは説明されるよりも簡単に示されます:

vec4 a = vec4(0.0, 1.0, 2.0, 3.0);
vec3 b = a.rgb; // Creates a vec3 with vec4 components.
vec3 b = a.ggg; // Also valid; creates a vec3 and fills it with a single vec4 component.
vec3 b = a.bgr; // Order does not matter.
vec3 b = a.xyz; // Also rgba, xyzw are equivalent.
vec3 b = a.stp; // And stpq (for texture coordinates).
float c = b.w; // Invalid, because "w" is not present in vec3 b.
vec3 c = b.xrt; // Invalid, mixing different styles is forbidden.
b.rrr = a.rgb; // Invalid, assignment with duplication.
b.bgr = a.rgb; // Valid assignment.

精度

データ型に精度修飾子を追加することができます。それらをuniform、変数、引数、およびvaryingに使用します。

lowp vec4 a = vec4(0.0, 1.0, 2.0, 3.0); // low precision, usually 8 bits per component mapped to 0-1
mediump vec4 a = vec4(0.0, 1.0, 2.0, 3.0); // medium precision, usually 16 bits or half float
highp vec4 a = vec4(0.0, 1.0, 2.0, 3.0); // high precision, uses full float or integer range (default)

一部の操作に低い精度を使用すると、関係する計算が高速化されます(精度は低下します)。これは、頂点プロセッサ関数ではほとんど必要ありません(ほとんどの場合、完全な精度が必要です)が、フラグメントプロセッサではしばしば有用です。

一部のアーキテクチャ(主にモバイル)はこれにより多くのメリットを得られますが、制限されていることにも注意してください(精度間の変換にはコストがかかります)。詳細については、ターゲットアーキテクチャの関連ドキュメントを参照してください。正直なところ、モバイルドライバーはバグが多いため、トラブルを避けるために、本当に必要がない限り、精度を指定せずに単純なシェーダーを作成します。

配列

配列は、類似したタイプの複数の変数のコンテナです。注: Godot 3.2では、ローカル配列と可 varying配列のみが実装されています。

ローカル配列

ローカル配列は関数で宣言されます。サンプラーを除くすべての許可されたデータ型を使用できます。配列宣言は、Cスタイルの構文 typename + identifier + [array size] に従います。

void fragment() {
    float arr[3];
}

これらは、最初のように初期化することができます:

float float_arr[3] = float[3] ( 1.0, 0.5, 0.0 ); // first constructor

int int_arr[3] = int[] ( 2, 1, 0 ); // second constructor

vec2 vec2_arr[3] = { vec2(1.0, 1.0), vec2(0.5, 0.5), vec2(0.0, 0.0) }; // third constructor

bool bool_arr[] = { true, true, false }; // fourth constructor - size is defined automatically from the element count

1つの式で複数の配列(サイズが異なる場合でも)を宣言できます:

float a[3] = float[3] (1.0, 0.5, 0.0),
 b[2] = {1.0, 0.5},
 c[] = { 0.7 },
 d = 0.0,
 e[5];

配列要素にアクセスするには、インデックス構文を使用します:

float arr[3];

arr[0] = 1.0; // setter

COLOR.r = arr[0]; // getter

配列には組み込み関数 .length() もあります(組み込みの length() 関数と混同しないでください)。パラメーターを受け入れず、配列のサイズを返します。

float arr[] = { 0.0, 1.0, 0.5, -1.0 };
for (int i = 0; i < arr.length(); i++) {
    // ...
}

注: 0未満または配列サイズより大きいインデックスを使用すると、シェーダーがクラッシュしてレンダリングが中断します。これを防ぐには、length()if または clamp() 関数を使用して、インデックスが0と配列の長さの間にあることを確認してください。コードは常に慎重にテストおよびチェックしてください。定数式または単純な数値を渡すと、エディタはその境界をチェックしてこのクラッシュを防ぎます。

定数

変数宣言の前に const キーワードを使用して、その変数を変更できないようにします。サンプラーを除くすべての基本型は、定数として宣言できます。定数値へのアクセスと使用は、ユニフォームの使用よりもわずかに高速です。定数は、宣言時に初期化する必要があります。

const vec2 a = vec2(0.0, 1.0);
vec2 b;

a = b; // invalid
b = a; // valid

定数は変更できず、さらにヒントを持つことはできませんが、複数の(同じ型の場合)を単一の式で宣言できます。例:

const vec2 V1 = vec2(1, 1), V2 = vec2(2, 2);

変数と同様に、配列は const で宣言することもできます。

const float arr[] = { 1.0, 0.5, 0.0 };

arr[0] = 1.0; // invalid

COLOR.r = arr[0]; // valid

定数は、グローバル(関数の外部)またはローカル(関数の内部)の両方で宣言できます。グローバル定数は、変更する必要のないシェーダー全体の値にアクセスする場合に役立ちます。ユニフォームと同様に、グローバル定数はすべてのシェーダーステージ間で共有されますが、シェーダーの外部からはアクセスできません。

shader_type spatial;

const float PI = 3.14159265358979323846;

Structs

Structs are compound types which can be used for better abstaction of shader code. You can declare them at the global scope like:

struct PointLight {
    vec3 position;
    vec3 color;
    float intensity;
};

After declaration, you can instantiate and initialize them like:

void fragment()
{
    PointLight light;
    light.position = vec3(0.0);
    light.color = vec3(1.0, 0.0, 0.0);
    light.intensity = 0.5;
}

Or use struct constructor for same purpose:

PointLight light = PointLight(vec3(0.0), vec3(1.0, 0.0, 0.0), 0.5);

Structs may contain other struct or array, you can also instance them as global constant:

shader_type spatial;

...

struct Scene {
    PointLight lights[2];
};

const Scene scene = Scene(PointLight[2](PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), 1.0), PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), 1.0)));

void fragment()
{
    ALBEDO = scene.lights[0].color;
}

You can also pass them to functions:

shader_type canvas_item;

...

Scene construct_scene(PointLight light1, PointLight light2) {
    return Scene({light1, light2});
}

void fragment()
{
    COLOR.rgb = construct_scene(PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), 1.0), PointLight(vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 1.0), 1.0)).lights[0].color;
}

演算子

Godotシェーディング言語は、GLSL ES 3.0と同じ一連の演算子をサポートしています。以下に優先順位のリストを示します:

優先順位 クラス 演算子
1 (最高) カッコ内のグループ化 ()
2 単項 +、-、!、~
3 乗除算 /、*、%
4 加減算 +、-
5 ビット単位のシフト <<、>>
6 大小比較 <、>、<=、>=
7 一致、不一致 ==、!=
8 ビット単位の論理積(and) &
9 ビット単位の排他的論理和(xor) ^
10 ビット単位の論理和(or) |
11 論理積 &&
12 (最低) 論理和 ||

構文制御

Godotシェーディング言語は、最も一般的なタイプの構文制御をサポートしています:

// if and else
if (cond) {

} else {

}

// switch
switch(i) { // signed integer expression
    case -1:
        break;
    case 0:
        return; // break or return
    case 1: // pass-through
    case 2:
        break;
    //...
    default: // optional
        break;
}

// for loops
for (int i = 0; i < 10; i++) {

}

// while
while (true) {

}

// do while
do {

} while(true);

最新のGPUでは、無限ループが存在し、アプリケーション(エディタを含む)がフリーズする可能性があることに注意してください。 Godotはこれからあなたを守ることはできないので、この間違いをしないように注意してください!

廃棄

フラグメントおよびライト関数では、discard キーワードを使用できます。使用すると、フラグメントは破棄され、何も書き込まれません。

関数

Godotシェーダーで関数を定義することが可能です。次の構文を使用します:

ret_type func_name(args) {
    return ret_type; // if returning a value
}

// a more specific example:

int sum2(int a, int b) {
    return a + b;
}

呼び出し元の関数から見て上記(エディタの上方)で定義された関数のみを使用できます。

関数の引数には特別な修飾子を含めることができます:

  • in: 引数が読み取り専用であることを意味します(デフォルト)。
  • out: 引数が書き込み専用であることを意味します。
  • inout: 引数が参照を介して完全に渡されることを意味します。

以下はその例です:

void sum2(int a, int b, inout int result) {
    result = a + b;
}

Varying(可変)

頂点からフラグメントプロセッサー関数にデータを送信するには、varying が使用されます。それらは頂点プロセッサーのすべてのプリミティブ頂点に設定され、フラグメントプロセッサーのすべてのピクセルに対して値が補間されます。

shader_type spatial;

varying vec3 some_color;
void vertex() {
    some_color = NORMAL; // Make the normal the color.
}

void fragment() {
    ALBEDO = some_color;
}

Varyingは配列にも指定できます:

shader_type spatial;

varying float var_arr[3];
void vertex() {
    var_arr[0] = 1.0;
    var_arr[1] = 0.0;
}

void fragment() {
    ALBEDO = vec3(var_arr[0], var_arr[1], var_arr[2]); // red color
}

補間修飾子

特定の値は、シェーディングパイプライン中に補間されます。補間修飾子 を使用して、これらの補間の実行方法を変更できます。

shader_type spatial;

varying flat vec3 our_color;

void vertex() {
    our_color = COLOR.rgb;
}

void fragment() {
    ALBEDO = our_color;
}

次の2つの補間修飾子があります:

修飾子 説明
flat 値は補間されません。
smooth 値は、パースペクティブに応じた方法で補間されます。これがデフォルトです。

Uniform(ユニフォーム)

シェーダーに値を渡すことは可能です。これらはシェーダー全体に対してグローバルであり、uniform と呼ばれます。シェーダーが後でマテリアルに割り当てられると、uniformはその中の編集可能なパラメーターとして表示されます。シェーダー内からuniformを書くことはできません。

shader_type spatial;

uniform float some_value;

マテリアルのエディタでuniformを設定できます。または、GDScriptを使用して設定できます:

material.set_shader_param("some_value", some_value)

注釈

set_shader_param の最初の引数はシェーダーのuniformの名前です。シェーダーのuniformの名前と完全に一致する必要があります。一致しない場合、認識されません。

void を除くすべてのGLSLタイプはuniformにすることができます。さらに、Godotはオプションのシェーダーヒントを提供して、uniformの使用内容をコンパイラに認識させます。

shader_type spatial;

uniform vec4 color : hint_color;
uniform float amount : hint_range(0, 1);
uniform vec4 other_color : hint_color = vec4(1.0);

Godotの3Dエンジンは線形色空間でレンダリングするため、色として提供されるテクスチャには適切なsRGB->線形変換(つまり、hint_albedo)のヒントが必要であることを理解することが重要です。

以下のヒントの完全なリスト:

タイプ(型) ヒント 説明
vec4 hint_color 色として使用
int、float hint_range(min,max [,step] ) 範囲として使用(最小/最大/ステップあり)
sampler2D hint_albedo アルベド色として使用、デフォルトは白
sampler2D hint_black_albedo アルベド色として使用、デフォルトは黒
sampler2D hint_normal 法線マップとして使用
sampler2D hint_white 値として、デフォルトは白です。
sampler2D hint_black 値として、デフォルトは黒です。
sampler2D hint_aniso フローマップとして、デフォルトは右です。

GDScriptはGLSLとは異なる変数タイプを使用するため、GDScriptからシェーダーに変数を渡すと、Godotはタイプを自動的に変換します。以下は、対応するタイプの表です:

GDScript型 GLSL型
bool bool
int int
float float
Vector2 vec2
Vector3 vec3
Color vec4
Transform mat4
Transform2D mat4

注釈

GDScriptからシェーダーuniformを設定するときは注意してください。タイプが一致しない場合、エラーはスローされません。シェーダーは未定義の動作を示すだけです。

Uniformにはデフォルト値を割り当てることもできます:

shader_type spatial;

uniform vec4 some_vector = vec4(0.0);
uniform vec4 some_color : hint_color = vec4(1.0);

組み込み関数

GLSL ES 3.0に準拠した多数の組み込み関数がサポートされています。 vec_type(float)、vec_int_type、vec_uint_type、vec_bool_type 命名法を使用する場合、スカラーまたはベクトルを使用できます。

注釈

GLES2バックエンドで使用できない関数のリストについては、Differences between GLES2 and GLES3 doc を参照してください。

関数 説明
vec_type radians ( vec_type 度 ) 度をラジアンに変換する
vec_type degrees ( vec_type ラジアン ) ラジアンを度に変換
vec_type sin ( vec_type x ) サイン(正弦)
vec_type cos ( vec_type x ) コサイン(余弦)
vec_type tan ( vec_type x ) タンジェント(正接)
vec_type asin ( vec_type x ) アークサイン(逆正弦)
vec_type acos ( vec_type x ) アークコサイン(逆余弦)
vec_type atan ( vec_type y_over_x ) アークタンジェント(逆正接)
vec_type atan ( vec_type y, vec_type x ) ベクトルを角度に変換するアークタンジェント
vec_type sinh ( vec_type x ) 双曲線サイン
vec_type cosh ( vec_type x ) 双曲線コサイン
vec_type tanh ( vec_type x ) 双曲線タンジェント
vec_type asinh ( vec_type x ) 双曲線アークサイン
vec_type acosh ( vec_type x ) 双曲線アークコサイン
vec_type atanh ( vec_type x ) 双曲線アークタンジェント
vec_type pow ( vec_type x, vec_type y ) 累乗
vec_type exp ( vec_type x ) eを底とする指数
vec_type exp2 ( vec_type x ) 2を底とする指数
vec_type log ( vec_type x ) 自然対数
vec_type log2 ( vec_type x ) 2を底とする対数
vec_type sqrt ( vec_type x ) 平方根
vec_type inversesqrt ( vec_type x ) 逆平方根
vec_type abs ( vec_type x ) 絶対値
ivec_type abs ( ivec_type x ) 絶対値
vec_type sign ( vec_type x ) 符号
ivec_type sign ( ivec_type x ) 符号
vec_type floor ( vec_type x ) フロア(床関数)
vec_type round ( vec_type x ) ラウンド(四捨五入)
vec_type roundEven ( vec_type x ) 最も近い偶数にラウンド
vec_type trunc ( vec_type x ) 小数点切り捨て
vec_type ceil ( vec_type x ) シィール(天井関数)
vec_type fract ( vec_type x ) 小数部
vec_type mod ( vec_type x, vec_type y ) 余剰
vec_type mod ( vec_type x , float y ) 余剰
vec_type modf ( vec_type x, out vec_type i ) xの小数部、iに整数部分が入る
vec_type min ( vec_type a, vec_type b ) 小さい方の値
vec_type max ( vec_type a, vec_type b ) 大きい方の値
vec_type clamp ( vec_type x, vec_type min, vec_type max ) MinとMaxの間にクランプ
vec_type mix ( float a, float b, float c ) aとbをcの比率で線形補間
vec_type mix ( vec_type a, vec_type b, float c ) aとbのベクトルをc(スカラー)の比率で線形補完
vec_type mix ( vec_type a, vec_type b, vec_type c ) aとbのベクトルをc(ベクトル)の比率で線形補完
vec_type mix ( vec_type a, vec_type b, bvec_type c ) aとbをc(ブールベクトル選択)で線形補間
vec_type step ( vec_type a, vec_type b ) b[i] < a[i] ? 0.0 : 1.0
vec_type step ( float a, vec_type b) b[i] < a ? 0.0 : 1.0
vec_type smoothstep ( vec_type a, vec_type b, vec_type c ) エルミート補間
vec_type smoothstep ( float a, float b, vec_type c ) エルミート補間
bvec_type isnan ( vec_type x ) スカラー、またはベクトル要素がNaNである
bvec_type isinf ( vec_type x ) スカラー、またはベクトル要素が INF である
ivec_type floatBitsToInt ( vec_type x ) 浮動小数点数->Int ビットコピー、変換なし
uvec_type floatBitsToUint ( vec_type x ) 浮動小数点数->UInt ビットコピー、変換なし
vec_type intBitsToFloat ( ivec_type x ) Int->浮動小数点 ビットコピー、変換なし
vec_type uintBitsToFloat ( uvec_type x ) UInt->浮動小数点 ビットコピー、変換なし
float length ( vec_type x ) ベクトルの長さ
float distance ( vec_type a, vec_type b ) ベクトル間の距離、つまり length(a-b)
float dot ( vec_type a, vec_type b ) 内積(ドット積)
vec3 cross ( vec3 a, vec3 b ) 外積 (クロス積)
vec_type normalize ( vec_type x ) 単位長に正規化
vec3 reflect ( vec3 I, vec3 N ) 反射
vec3 refract ( vec3 I, vec3 N, float eta ) 屈折
vec_type faceforward ( vec_type N, vec_type I, vec_type Nref ) もしも dot(Nref, I) < 0 なら Nを返し、そうでなければ –Nを返す (訳注: 視線に対して面の法線の表裏を揃える時などに使用)
mat_type matrixCompMult ( mat_type x, mat_type y ) 行列要素の乗算
mat_type outerProduct ( vec_type column, vec_type row ) 行列の外積
mat_type transpose ( mat_type m ) 転置行列
float determinant ( mat_type m ) 行列式
mat_type inverse ( mat_type m ) 逆行列
bvec_type lessThan ( vec_type x, vec_type y ) int/uint/floatベクトルの各要素を比較(x < y)した結果をBoolベクトルとして返す
bvec_type greaterThan ( vec_type x, vec_type y ) int/uint/floatベクトルの各要素を比較(x > y)した結果をBoolベクトルとして返す
bvec_type lessThanEqual ( vec_type x, vec_type y ) int/uint/floatベクトルの各要素を比較(x <= y)した結果をBoolベクトルとして返す
bvec_type greaterThanEqual ( vec_type x, vec_type y ) int/uint/floatベクトルの各要素を比較(x >= y)した結果をBoolベクトルとして返す
bvec_type equal ( vec_type x, vec_type y ) int/uint/floatベクトルの各要素を比較(x == y)した結果をBoolベクトルとして返す
bvec_type notEqual ( vec_type x, vec_type y ) int/uint/floatベクトルの各要素を比較(x != y)した結果をBoolベクトルとして返す
bool any ( bvec_type x ) 任意の要素が true
bool all ( bvec_type x ) 全ての要素が true
bvec_type not ( bvec_type x ) ブールベクトルの反転
ivec2 textureSize ( sampler2D_type s, int lod ) 2Dテクスチャのサイズを取得する
ivec3 textureSize ( sampler2DArray_type s, int lod ) 2Dテクスチャ配列のサイズを取得する
ivec3 textureSize ( sampler3D s, int lod ) 3Dテクスチャのサイズを取得する
ivec2 textureSize ( samplerCube s, int lod ) キューブテクスチャのサイズを取得する
vec4_type texture ( sampler2D_type s, vec2 uv [, float bias] ) 2Dテクスチャの読み取りを実行する
vec4_type texture ( sampler2DArray_type s, vec3 uv [, float bias] ) 2D テクスチャ配列の読み取りを実行する
vec4_type texture ( sampler3D_type s, vec3 uv [, float bias] ) 3Dテクスチャの読み取りを実行する
vec4 texture ( samplerCube s, vec3 uv [, float bias] ) キューブテクスチャの読み取りを実行する
vec4_type textureProj ( sampler2D_type s, vec3 uv [, float bias] ) 投影を使用して2Dテクスチャの読み取りを実行する
vec4_type textureProj ( sampler2D_type s, vec4 uv [, float bias] ) 投影を使用して2Dテクスチャの読み取りを実行する
vec4_type textureProj ( sampler3D_type s, vec4 uv [, float bias] ) 投影を使用して3Dテクスチャの読み取りを実行する
vec4_type textureLod ( sampler2D_type s, vec2 uv, float lod ) カスタムミップマップで2Dテクスチャの読み取りを実行する
vec4_type textureLod ( sampler2DArray_type s, vec3 uv, float lod ) カスタムミップマップで2Dテクスチャ配列の読み取りを実行します
vec4_type textureLod ( sampler3D_type s, vec3 uv, float lod ) カスタムミップマップで3Dテクスチャの読み取りを実行する
vec4 textureLod ( samplerCube s, vec3 uv, float lod ) カスタムミップマップで3Dテクスチャの読み取りを実行する
vec4_type textureProjLod ( sampler2D_type s, vec3 uv, float lod ) プロジェクション/LODで2Dテクスチャの読み取りを実行する
vec4_type textureProjLod ( sampler2D_type s, vec4 uv, float lod ) プロジェクション/LODで2Dテクスチャの読み取りを実行する
vec4_type textureProjLod ( sampler3D_type s, vec4 uv, float lod ) プロジェクション/LODで3Dテクスチャの読み取りを実行する
vec4_type texelFetch ( sampler2D_type s, ivec2 uv, int lod ) 整数座標を使用して単一のテクセルを取得する
vec4_type texelFetch ( sampler2DArray_type s, ivec3 uv, int lod ) 整数座標を使用して単一のテクセルを取得する
vec4_type texelFetch ( sampler3D_type s, ivec3 uv, int lod ) 整数座標を使用して単一のテクセルを取得する
vec_type dFdx ( vec_type p ) ローカル差分を使用したxの微分
vec_type dFdy ( vec_type p ) ローカル差分を使用したyの微分
vec_type fwidth ( vec_type p ) xとyの絶対微分の合計