CustomMaterial QML Type

モデルのシェーディングに使用するカスタムマテリアルを作成するためのベースコンポーネントです。詳細...

Import Statement: import QtQuick3D
Inherits:

Material

プロパティ

詳細

カスタムマテリアルを使用すると、マテリアルにカスタムシェーダーコードを使用できるようになり、グラフィックスシェーダーレベルでプログラム可能になります。頂点シェーダ、フラグメントシェーダ、またはその両方のシェーダを指定できます。vertexShader およびfragmentShader プロパティは URL で、シェーダースニペットを含むファイルを参照し、ShaderEffect またはImage.source と非常によく似た動作をします。カスタムマテリアルでサポートされているのは、fileqrc のスキームのみです。file スキームを省略することも可能で、便利な方法で相対パスを指定できます。このようなパスは、コンポーネント(.qml ファイル)の場所からの相対パスとして解決されます。

カスタムマテリアルの入門ガイドについては、プログラマブルマテリアル、エフェクト、ジオメトリ、テクスチャデータのページを参照してください。

はじめに

同じシーンの次のバージョンを考えてみましょう。左側では、シリンダは組み込みの非プログラマブルマテリアルを使用しています。このようなマテリアルは、幅広いプロパティで設定可能ですが、フードの下で生成されるシェーダについては、それ以上の制御はできません。右側では、同じシリンダーが、アプリケーションから提供された頂点およびフラグメントシェーダースニペットを参照するCustomMaterialに関連付けられています。これにより、カスタムでアプリケーション固有のロジックを頂点シェーダに挿入してジオメトリを変換し、フラグメントシェーダでカスタムな方法で特定のカラープロパティを決定することができます。これはshaded カスタムマテリアルなので、シリンダは通常通りシーンライティ ングに参加します。

View3D {
    anchors.fill: parent
    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(0, 0, 600)
    }
    camera: camera
    DirectionalLight {
        position: Qt.vector3d(-500, 500, -100)
        color: Qt.rgba(0.2, 0.2, 0.2, 1.0)
        ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
    }
    Model {
        source: "#Cylinder"
        eulerRotation: Qt.vector3d(30, 30, 0)
        scale: Qt.vector3d(1.5, 1.5, 1.5)
        materials: [
            DefaultMaterial {
                diffuseColor: Qt.rgba(0, 1, 0, 1)
            }
        ]
    }
}
View3D {
    anchors.fill: parent
    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(0, 0, 600)
    }
    camera: camera
    DirectionalLight {
        position: Qt.vector3d(-500, 500, -100)
        color: Qt.rgba(0.2, 0.2, 0.2, 1.0)
        ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
    }
    Model {
        source: "#Cylinder"
        eulerRotation: Qt.vector3d(30, 30, 0)
        scale: Qt.vector3d(1.5, 1.5, 1.5)
        materials: [
            CustomMaterial {
                vertexShader: "material.vert"
                fragmentShader: "material.frag"
                property real uTime
                property real uAmplitude: 50
                NumberAnimation on uTime { from: 0; to: 100; duration: 10000; loops: -1 }
            }
        ]
    }
}

material.vertmaterial.frag のシェーダースニペットを次のように仮定しましょう:

void MAIN()
{
    VERTEX.x += sin(uTime + VERTEX.y) * uAmplitude;
}
void MAIN()
{
    BASE_COLOR = vec4(0.0, 1.0, 0.0, 1.0);
}

uTimeuAmplitude が CustomMaterial 要素のプロパティであることに注目してください。これらは値を変更することができ、普通にアニメートされ、開発者が何もしなくても自動的にシェーダに値が公開されます。

その結果、頂点がアニメーションする円柱ができます:

2種類のカスタムマテリアル

カスタムマテリアルには主に2つの種類があります。これはshadingMode プロパティで指定します。unshaded カスタムマテリアルでは、フラグメントシェーダはシーン内のライト、ライトプローブ、シャドウイングを無視して、単一のvec4 カラーを出力します。shaded マテリアルでは、シェーダは特定の関数を実装し、組み込み変数と連携して、ライティングとシャドウの寄与を考慮することが期待されます。

デフォルトの選択は一般的にシェーディングマテリアルで、これはshadingMode プロパティのデフォルト値に反映されています。これは、頂点やジオメトリから入力されるその他のデータを変換する必要があるマテリアルに適しています。また、BASE_COLOREMISSIVE_COLOR のような値を、おそらくSCREEN_TEXTUREDEPTH_TEXTURE をサンプリングすることによってカスタムで決定する必要があります。さらに、このようなマテリアルは、指向性ライト、ポイントライト、およびその他のライトからの寄与を計算するために使用される方程式をオーバーライドして再実装することもできます。アプリケーションが提供するシェーダースニペットは、標準マテリアルが持つライティ ングなどの機能を提供するために、Qt Quick 3Dエンジンによって大きく修正されます。

非シェーディングマテリアルは、オブジェクトの外観が完全にカスタムシェーダコードによって決定される場合に便利です。このようなマテリアルのシェーダは、エンジンによって最小限の追加しか受けないため、最終的なフラグメントの色を決定するのは完全にシェーダ次第です。これにより自由度が増しますが、ライトのようなシーンの他の要素と統合する可能性も制限されます。

注意: シェーダーコードは、Qt が実行時に使用するグラフィックス API に関係なく、常に Vulkan スタイルの GLSL を使用して提供されます。

注意 : マテリアルが提供する頂点シェーダとフラグメントシェーダのコードは、それ自体が完全な GLSL シェーダではありません。むしろ、これらは一連の関数を提供し、エンジンによってさらなるシェーダーコードで修正されます。

シェーダーへのデータの公開

CustomMaterial のダイナミックプロパティは、QML とQt Quick の機能を使って変更したりアニメートしたりすることができ、その値は自動的にシェーダに公開されます。これはShaderEffect と非常に似ています。以下のリストは、プロパティがどのようにマッピングされるかを示しています:

  • bool、int、real -> bool、int、float
  • QColorbool, int -> real -> bool, int, float,color -> vec4, QML で指定されたカラー値に対して sRGB 空間を仮定してカラーがリニアに変換されます。"green" のような Qt 組み込みの色も sRGB 色空間であり、DefaultMaterial とPrincipledMaterial のすべての色プロパティに対して同じ変換が行われるため、CustomMaterial のこの動作はこれらに一致します。Qt Quick とは異なり、Qt Quick の場合、一般的に 3D シーン上でトーンマッピングが実行されるため、3D リニアライジングが不可欠です。
  • QRect QRectF, -> vec4rect
  • QPoint QPointF, , , , -> vec2point QSize QSizeF size
  • QVector2D vector2d -> vec2
  • QVector3D vector3d -> vec3
  • QVector4D vector4d -> vec4
  • QMatrix4x4 matrix4x4 -> mat4
  • QQuaternion quaternion -> vec4、スカラー値はw
  • TextureInput -> のテクスチャ・プロパティで と のどちらが使用されているかによって、サンプラー2D またはサンプラー立方体になります。 プロパティを false に設定すると、シェーダーにダミー・テクスチャが公開されます。つまり、シェーダーはまだ機能しますが、不透明な黒い画像コンテンツを持つテクスチャをサンプリングします。サンプラー用のプロパティは、 を直接参照するのではなく、常に オブジェクトを参照しなければならないという事実に注意してください。 プロパティに関して言えば、ソース、タイリング、およびフィルタリング関連のものだけが、カスタムマテリアルで暗黙的に考慮されるものです。残りのもの(UV 変換など)は、カスタムシェーダが適切と考えるように実装することができます。TextureInput Texture CubeMapTexture enabled Texture TextureInput Texture

注意: シェーダコードで参照されるユニフォームに対応するプロパティがない場合、実行時にマテリアルを処理する際にシェーダのコンパイルエラーが発生します。サンプラーユニフォームのように、対応する QML プロパティが存在しない場合、ダミーテクスチャがバインドされる例外もありますが、一般的なルールとして、すべてのユニフォームとサンプラーは、CustomMaterial オブジェクトで対応するプロパティが宣言されている必要があります。

シェーディングされていないカスタムマテリアル

以下はunshaded カスタムマテリアルの例です。

CustomMaterial {
    // These properties are automatically exposed to the shaders
    property real time: 0.0
    property real amplitude: 5.0
    property real alpha: 1.0
    property TextureInput tex: TextureInput {
        enabled: true
        texture: Texture { source: "image.png" }
    }

    shadingMode: CustomMaterial.Unshaded
    sourceBlend: alpha < 1.0 ? CustomMaterial.SrcAlpha : CustomMaterial.NoBlend
    destinationBlend: alpha < 1.0 ? CustomMaterial.OneMinusSrcAlpha : CustomMaterial.NoBlend
    cullMode: CustomMaterial.BackFaceCulling

    vertexShader: "customshader.vert"
    fragmentShader: "customshader.frag"
}

上記の例では、unshaded の頂点シェーダとフラグメントシェーダのスニペットは次のようになります。シェーダがユニフォームや頂点入力を宣言しないことに注意してください。

VARYING vec3 pos;
VARYING vec2 texcoord;

void MAIN()
{
    pos = VERTEX;
    pos.x += sin(time * 4.0 + pos.y) * amplitude;
    texcoord = UV0;
    POSITION = MODELVIEWPROJECTION_MATRIX * vec4(pos, 1.0);
}
VARYING vec3 pos;
VARYING vec2 texcoord;

void MAIN()
{
    vec4 c = texture(tex, texcoord);
    FRAGCOLOR = vec4(pos.x * 0.02, pos.y * 0.02, pos.z * 0.02, alpha) * c;
}

以下の特殊な大文字キーワードが使用可能です:

  • MAIN -> バーテックスシェーダまたはフラグメントシェーダスニペット内のエ ントリポイントの名前は常にMAIN でなければなりません。この関数を提供することは、シェーディングされていないカ スタムマテリアルのシェーダースニペットでは必須です。
  • VARYING -> バーテックスシェーダからの出力またはフラグメントシェーダへの入力を宣言します。
  • POSITION -> vec4、頂点シェーダからの出力。
  • FRAGCOLOR -> vec4、フラグメントシェーダからの出力。シェーディングされていないカスタムマテリアルのみ使用可能。
  • VERTEX -> vec3、頂点シェーダ内の頂点位置。
  • NORMAL -> vec3、頂点シェーダの頂点法線。関連するモデルのメッシュが法線を提供しない場合、値はvec3(0.0)です。
  • UV0 -> vec2、頂点シェーダのテクスチャ座標の最初のセット。関連モデルのメッシュがテクスチャ座標を提供しない場合、値はvec2(0.0)です。
  • UV1 -> vec2、頂点シェーダのテクスチャ座標の2番目のセット。関連するモデルのメッシュがテクスチャ座標の2番目のセットを提供しない場合、値はvec2(0.0)です。
  • COLOR -> vec4、頂点シェーダの頂点カラー。関連するモデルのメッシュが頂点ごとの色を提供しない場合、値はvec4(1.0)です。
  • TANGENT -> vec3、頂点シェーダにおける接線。関連するモデルのメッシュが接線データを提供しない場合、値はvec3(0.0)です。
  • BINORMAL -> vec3、頂点シェーダの2法線。関連するモデルのメッシュが2法線データを提供しない場合、値はvec3(0.0)です。
  • JOINTS -> ivec4、頂点シェーダのジョイントインデックス。関連モデルのメッシュがジョイントインデックスのデータを提供しない場合、値はivec4(0)です。
  • WEIGHTS -> vec4、頂点シェーダのジョイント重み。関連モデルのメッシュがジョイントウェイトデータを提供しない場合、値はvec4(0.0)です。
  • MORPH_POSITION(n) -> vec3、頂点シェーダ内のn+1番目のモーフターゲット位置。関連するモデルが適切なデータを提供する必要があります。
  • MORPH_NORMAL(n) -> vec3、頂点シェーダにおけるn+1番目のモーフターゲットの法線。関連するモデルが適切なデータを提供する必要があります。
  • MORPH_TANGENT(n) -> vec3、頂点シェーダにおけるn+1 番目のモーフターゲットの接線。関連するモデルが適切なデータを提供する必要があります。
  • MORPH_BINORMAL(n) -> vec3、頂点シェーダにおけるn+1 番目のモーフターゲットの法線。関連するモデルが適切なデータを提供する必要があります。
  • MODELVIEWPROJECTION_MATRIX -> mat4,モデルビュープロジェクション行列.投影行列は常にOpenGLの規約に従っており、実行時に使用されるグラフィックスAPIに応じて、Y軸方向とクリップ深度のためのベイクイン変換が行われます。
  • VIEWPROJECTION_MATRIX -> mat4、ビュープロジェクション行列。
  • PROJECTION_MATRIX -> mat4,投影行列.
  • INVERSE_PROJECTION_MATRIX -> mat4,逆投影行列.
  • VIEW_MATRIX -> mat4,ビュー(カメラ)行列.
  • MODEL_MATRIX -> mat4,モデル(ワールド)行列.
  • NORMAL_MATRIX -> mat3, 法線行列(モデル行列の左上 3x3 部分の逆行列の転置).
  • BONE_TRANSFORMS -> mat4[], モデルのボーン行列の配列。
  • BONE_NORMAL_TRANSFORMS -> mat3[],モデルのボーン法線行列の配列(各ボーン行列の左上 3x3 部分の逆行列の転置).
  • MORPH_WEIGHTS -> float[], モーフの重みの配列。関連モデルは適切なデータを提供する必要があります。安全のため、QT_MORPH_MAX_COUNTはこの配列のサイズに定義されます。
  • CAMERA_POSITION -> vec3、ワールド空間でのカメラの位置。
  • CAMERA_DIRECTION -> vec3、カメラの方向ベクトル。
  • CAMERA_PROPERTIES -> vec2、カメラの近距離クリップ値と遠距離クリップ値。
  • POINT_SIZE -> float、頂点シェーダでのみ書き込み可能。点のトポロジーを持つジオメトリをレンダリングする場合、カスタム頂点シェーダは、シェーディングされたカスタムマテリアルとシェーディングされていないカスタムマテリアルの両方で、これを 1.0 または別の値に設定する必要があります。1 以外のサイズのサポートについては、PrincipledMaterial::pointSize を参照してください。

シェーデッドカスタムマテリアル

shaded マテリアルaugments は、PrincipledMaterial によって生成されるシェーダーコードです。シェーディングされていないマテリアルとは異なり、頂点シェーダーとフラグメントシェーダーのメイン関数のほぼすべてのロジックを独自に提供し、ライティング、シャドウイング、グローバルイルミネーションなどの生成コードを追加することを防ぎます、シェーディングされたマテリアルは、CustomMaterial があたかもPrincipledMaterial であるかのように、シェーダ生成を通常通り行うことができます。頂点シェーダとフラグメントシェーダのスニペットは、特定のポイントで呼び出されるオプション関数を提供し、ライティングと最終的なフラグメントカラーの計算に使用される色やその他の値をカスタマイズする可能性を与えることが期待されています。

MAIN 関数だけを実装するのではなく、シェーディングカスタムマテリアルのフラグメントシェーダは複数の関数を実装することができます。MAIN を含むすべての関数は、シェーディングカスタムマテリアルに実装することはオプションです。空のシェーダースニペットや、vertexShader またはfragmentShader プロパティをまったく指定しないことも完全に有効です。

シェーデッドカスタムマテリアル内の頂点シェーダースニペット

以下の関数を頂点シェーダースニペットで実装できます:

  • void MAIN() この関数がある場合、頂点シェーダから出力される vec4 である の値を設定するためにこの関数が呼び出され、オプションとして , , , , , , , , の値を変更するために呼び出されます。シェーディングされていないマテリアルとは異なり、これ らに書き込むことは、生成されたシェーダコードの残りの部分で修正 された値が考慮される(シェーディングされていないマテリアルでは、 追加のシェーダコードは生成されない)ため、意味があります。たとえば、カスタム頂点シェーダが頂点や法線を変位させる場合、 や に変更後の値を保存して、後で正しいライティング計算を行いたいでしょう。さらに、この関数は、 で定義された変数に書き込み、補間されたデータをフラグメントシェーダに渡すことができます。この関数または の再定義がない場合、 は と に基づいて計算され、 と同じようになります。POSITION VERTEX COLOR NORMAL UV0 UV1 TANGENT BINORMAL JOINTS WEIGHTS VERTEX NORMAL VARYING POSITION POSITION VERTEX MODELVIEWPROJECTION_MATRIX PrincipledMaterial

    ユニフォームとして公開されている QML プロパティと、フラグメントシェーダにデータを渡すことの両方に依存する例:

    VARYING vec3 vNormal;
    VARYING vec3 vViewVec;
    
    void MAIN()
    {
        VERTEX.x += sin(uTime * 4.0 + VERTEX.y) * uAmplitude;
        vNormal = normalize(NORMAL_MATRIX * NORMAL);
        vViewVec = CAMERA_POSITION - (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
        POSITION = MODELVIEWPROJECTION_MATRIX * vec4(VERTEX, 1.0);
    }

    注意: 上記の例では、POSITION への値の割り当てはオプションです。この場合の使い方はデフォルトの動作と同じです。

:頂点からフラグメント・ステージに補間なしでデータを渡すには、VARYING 宣言の型の前にflat キーワードを追加します。

シェーデッドカスタムマテリアルのフラグメントシェーダのスニペット

フラグメントシェーダースニペットには次の関数を実装できます:

  • void MAIN() この関数が存在すると、書き込み可能な特殊変数BASE_COLOR,METALNESS,ROUGHNESS,SPECULAR_AMOUNT, NORMAL, CLEARCOAT_FRESNEL_POWER, CLEARCOAT_FRESNEL_SCALE, CLEARCOAT_FRESNEL_BIAS の値を設定するために呼び出されます、CLEARCOAT_AMOUNT、 CLEARCOAT_ROUGHNESS、 CLEARCOAT_NORMAL、 FRESNEL_BIAS、 FRESNEL_SCALE、 FRESNEL_POWER、 IOR、TRANSMISSION_FACTOR 、 THICKNESS_FACTOR、 ATTENUATION_COLOR、 ATTENUATION_DISTANCE、OCCLUSION_AMOUNT

    1つの一般的な使用ケースは、ベースカラーマップ、SCREEN_TEXTURE 、または他の種類のソースであるテクスチャのサンプリングに基づいて、BASE_COLOR の値を設定することです。これは、特にカスタムライトプロセッサ関数が実装されていない場合に関連性が高く、便利です。BASE_COLOR.a をデフォルトの1.0以外に設定すると、フラグメントの最終的なアルファ値に影響を与えることができます。(この場合、sourceBlenddestinationBlend でアルファブレンディングを有効にする必要があります。)

    もう一つのシナリオは、カスタムSPECULAR_LIGHT 関数が提供されていない場合、またはSceneEnvironment で設定されたライトプローブがある場合です。スペキュラ寄与計算に影響するメタルネス、ラフネス、およびその他の値は、MAIN で希望のカスタム値に設定できます。

    この関数は、以下の特殊変数に書き込むことができます。これらに書き込まれる値は通常、ハードコードされるか、ユニフォームにマッピングされたQMLプロパティに基づいて計算されます。セマンティクスはPrincipledMaterial と同じです。

    • vec4BASE_COLOR - ベースカラーとマテリアルのアルファ値。built-in materials' color property に対応します。 ライトプロセッサ関数が実装されていない場合、MAIN でカスタムベースカラーを設定すると、デフォルトのライティング計算に反映されるので便利です。デフォルト値はvec4(1.0) で、アルファ値 1.0 の白を意味します。アルファ値はフラグメントの最終的なアルファ値に影響します。最終的なアルファ値は、オブジェクト (モデル) の不透明度にベースカラーのアルファ値を掛けたものになります。QMLのカラープロパティから公開される一様な値に頼らず、シェーダコードで直接値を指定する場合、必要に応じてsRGBからリニアへの変換を行うのはシェーダ次第であることに注意してください。たとえば、vec3 colorfloat alpha を想定すると、次のようになります:
      float C1 = 0.305306011;
      vec3 C2 = vec3(0.682171111, 0.682171111, 0.682171111);
      vec3 C3 = vec3(0.012522878, 0.012522878, 0.012522878);
      BASE_COLOR = vec4(rgb * (rgb * (rgb * C1 + C2) + C3), alpha);
    • vec3EMISSIVE_COLOR - 自己照明の色。組み込みマテリアルの発光色に対応し、built-in materials's emissiveFactor propertybuilt-in materials's emissiveMap property で合成されます。デフォルト値はvec3(0.0) です。QML のカラープロパティから公開される一様な値に頼らず、シェーダコードで直接値を指定する場合、必要に応じて sRGB から線形への変換を行うのはシェーダ次第であることに注意してください。
    • floatIOR マテリアルの屈折率を指定します。一般的な値は1.5 で、デフォルトはPrincipledMaterial です。
    • floatTRANSMISSION_FACTOR 半透明の量を指定します。一般的な値は1.0 で、デフォルトはPrincipledMaterial なので0.0 です。
    • floatTHICKNESS_FACTOR 半透明材料の厚さを指定します。一般的な値は10.0 で、デフォルトはPrincipledMaterial である0.0 です。
    • vec3ATTENUATION_COLOR 半透明マテリアルの距離による色のずれを指定します。一般的な値はvec3(1.0, 0.0, 0.0) で、デフォルトはPrincipledMaterial であるvec3(1.0) です。
    • floatATTENUATION_DISTANCE 半透明材料のカラーシフトの距離減衰を指定します。一般的な値は100.0 で、デフォルトはPrincipledMaterial である0.0 です。
    • floatMETALNESS 金属感の量を 0.0 - 1.0 の範囲で指定します。デフォルト値は0。効果を得るには0以外の値に設定する必要がある。
    • floatROUGHNESS 0.0 - 1.0 の範囲のラフネス値。デフォルト値は 0。
    • floatCLEARCOAT_FRESNEL_POWER クリアコート層のフレネルパワーを指定します。一般的な値は5.0 で、デフォルト値もPrincipledMaterial です。
    • floatCLEARCOAT_FRESNEL_SCALE クリアコート層のフレネルスケールを指定します。典型的な値は1.0 で、デフォルトもPrincipledMaterial です。
    • floatCLEARCOAT_FRESNEL_BIAS クリアコート層のフレネルバイアスを指定します。一般的な値で、デフォルトもPrincipledMaterial で使用される0.0 です。
    • floatCLEARCOAT_AMOUNT 材料の上にあるクリアコート層の量を指定します。一般的な値は1.0 で、デフォルトはPrincipledMaterial である0.0 です。
    • floatCLEARCOAT_ROUGHNESS クリアコート層の粗さを指定します。典型的な値は、完全にぼかしたクリアコート層の場合は1.0 で、デフォルトはPrincipledMaterial のように0.0 です。
    • vec3CLEARCOAT_NORMAL - ワールド空間の頂点シェーダから来るクリアコートレイヤーの法線。このプロパティの初期値はVAR_WORLD_NORMAL と同じですが、CLEARCOAT_NORMAL の値を変更するだけで、クリアコートレイヤーの法線に影響を与えます。
    • floatFRESNEL_POWER フレネルパワーを指定します。一般的な値は5.0 で、デフォルトはPrincipledMaterial です。
    • floatFRESNEL_SCALE フレネルスケールを指定します。典型的な値で、デフォルトもPrincipledMaterial で使用される1.0 である。
    • floatFRESNEL_BIAS フレネルバイアスを指定します。典型的な値は0.0 で、デフォルトもPrincipledMaterial です。
    • floatSPECULAR_AMOUNT スペキュラ量を 0.0 - 1.0 の範囲で指定します。デフォルト値は0.5 で、PrincipledMaterial::specularAmount と一致します。0 以外の値に設定 し なければ効果があ り ません。
    • floatOCCLUSION_AMOUNT AO 係数を指定します。一般的な値は1.0 であり、デフォルト値もPrincipledMaterial である。
    • vec3NORMAL - ワールド空間の頂点シェーダから来る法線。このプロパティの初期値はVAR_WORLD_NORMAL と同じですが、ライティングに影響を与えるのはNORMAL の値を変更した場合のみです。
    • vec3TANGENT - ワールド空間の頂点シェーダから来る接線。この値は両面性が調整される可能性があります。
    • vec3BINORMAL - ワールド空間の頂点シェーダから来る二法線。この値は両面性が調整される可能性があります。
    • vec2UV0 - バーテックスシェーダーからのテクスチャ座標の最初のセット。このプロパティはフラグメントシェーダでは読み取り専用です。
    • vec2UV1 - バーテックスシェーダからのテクスチャ座標の 2 番目のセット。このプロパティはフラグメントシェーダでは読み込み専用です。

    注意: シェーディングされていないマテリアルとは異なり、シェーディングされたマテリアルのフラグメントMAINFRAGCOLOR を直接制御することはできません。むしろ、最終的なフラグメントの色を決定するのは、ライトプロセッサ関数に書かれたDIFFUSESPECULAR の値です。ライトプロセッサ関数が実装されていない場合、関連するデフォルトのシェーディング計算はPrincipledMaterial と同様に行われ、BASE_COLOR と上記のリストにあるその他の値が考慮されます。

    シンプルでメタリックなカスタム・マテリアル・シェーダーの例を以下に示します:

    void MAIN()
    {
        METALNESS = 1.0;
        ROUGHNESS = 0.5;
        FRESNEL_POWER = 5.0;
    }

    ベースカラーとアルファはテクスチャをサンプリングして設定します:

    VARYING vec2 texcoord;
    void MAIN()
    {
        BASE_COLOR = texture(uColorMap, texcoord);
    }
  • void AMBIENT_LIGHT() 存在する場合、この関数は各フラグメントに対して1回呼び出されます。この関数のタスクは、書き込み可能な特殊変数DIFFUSE にアンビエント寄与の合計を追加することです。もちろん、別の値を計算することも、DIFFUSE にまったく触れない(アンビエントライティングを完全に無視する)こともできます。この関数が全く存在しない場合、アンビエント寄与はPrincipledMaterial が行うように通常通り計算されます。

    この関数は以下の特殊変数に書き込むことができます:

    • vec3DIFFUSE フラグメントごとの拡散光寄与を累積します。この値を上書きすると、他のライトからの寄与が失われるため、ライトプロセッサ関数は、通常、(+=
  • )を
    • 追加します。

    この関数は、上記の表から、マトリックス(例えば、MODEL_MATRIX )とベクトル(例えば、CAMERA_POSITION

  • ユニフォームに加えて、次の特殊変数を読み込むことができます:

    • vec3TOTAL_AMBIENT_COLOR シーン内のアンビエント寄与の合計。

    void AMBIENT_LIGHT()
    {
        DIFFUSE += TOTAL_AMBIENT_COLOR;
    }
  • void DIRECTIONAL_LIGHT() この関数が存在する場合、この関数は、各フラグメントのシーン内の各アクティブディレクショナルライトに対して呼び出されます。この関数のタスクは、書き込み可能な特殊変数DIFFUSE にディフューズ寄与を追加することです。この関数は何もしないこともでき、その場合、指向性ライトからのディフューズ寄与は無視されます。関数が全く存在しない場合、指向性ライトからのディフューズ寄与は、PrincipledMaterial が行うように、普通に累積されます。

    関数は、以下の特殊変数に書き込むことができます:

    • vec3DIFFUSE フラグメントごとに、ディフューズ光寄与を累積します。この値を上書きすると、他のライトからの寄与が失われるため、ライトプロセッサ関数は、通常、これに (+=
    ) を
    • 追加します。

    この関数は、上の表にあるマトリックス (MODEL_MATRIX など

    )

    とベクトル (CAMERA_POSITION など

    )

    のユニフォームに加えて、次の特殊変数を読み込むことができます:

    • vec3LIGHT_COLOR ディフューズライトの色。
    • floatSHADOW_CONTRIB シャドウの寄与、または 1。
    • vec3TO_LIGHT_DIR 光源を指すベクトル。
    • vec3NORMAL ワールド空間の法線ベクトル。
    • vec4BASE_COLOR ベースカラーとマテリアルのアルファ値。
    • floatMETALNESS メタルネス量。
    • floatROUGHNESS ラフネス量。

    例:

    void DIRECTIONAL_LIGHT()
    {
        DIFFUSE += LIGHT_COLOR * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR)));
    }
  • void POINT_LIGHT() この関数が存在すると、シーン内のアクティブなポイントライトごとに、フラグメントごとに呼び出されます。この関数のタスクは、書き込み可能な特殊変数DIFFUSE にディフューズの寄与を追加することです。この関数は何もしないこともでき、その場合、ポイントライトからのディフューズ寄与は無視されます。この関数がまったく存在しない場合、点光源からの拡散寄与は、PrincipledMaterial が行うように、普通に累積されます。

    この関数は、次の特殊変数に書き込むことができます:

    • vec3DIFFUSE フラグメントごとに、拡散光寄与を累積します。

    この関数は、上の表にある行列(たとえば、MODEL_MATRIX )とベクトル(たとえば、CAMERA_POSITION

    ユニフォームに加えて、次の特殊変数を読み込むことができます:

    • vec3LIGHT_COLOR 拡散光源色。
  • LIGHT_ATTENUATION SHADOW_CONTRIB
  • v
    • ec3TO_LIGHT_DIR 光源を指すベクトル。
    • vec3NORMAL ワールド空間の法線ベクトル。
    • vec4BASE_COLOR ベースカラーとマテリアルのアルファ値。
    • floatMETALNESS メタルネス量。
    • floatROUGHNESS ラフネス量。

    例:

    void POINT_LIGHT()
    {
        DIFFUSE += LIGHT_COLOR * LIGHT_ATTENUATION * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR)));
    }
  • void SPOT_LIGHT() この関数が存在すると、シーン内のアクティブなスポットライトごとに、フラグメントごとに呼び出されます。この関数のタスクは、書き込み可能な特殊変数DIFFUSE にディフューズの寄与を追加することです。この関数は何もしないこともでき、その場合、スポットライトからのディフューズ寄与は無視されます。この関数が全く存在しない場合、スポットライトからの拡散寄与は、PrincipledMaterial が行うように、普通に累積されます。

    この関数は、次の特殊変数に書き込むことができます:

    • vec3DIFFUSE フラグメントごとに、拡散光寄与を累積します。

    この関数は、上の表にあるマトリックス(たとえば、MODEL_MATRIX )とベクトル(たとえば、CAMERA_POSITION

    ユニフォームに加えて、次の特殊変数を読み込むことができます:

    • vec3LIGHT_COLOR 拡散光色。
  • NORMAL f
    • loatLIGHT_ATTENUATION 光の減衰。
    • floatSHADOW_CONTRIB 影の寄与。影がまったくないか、影を受け取らない場合は 1.0。
    • vec3TO_LIGHT_DIR 光源を指すベクトル。
    • floatSPOT_FACTOR スポット光係数
    • vec4BASE_COLOR ベースカラーとマテリアルのアルファ値。
    • floatMETALNESS メタルネス量。
    • floatROUGHNESS ラフネス量。

    例:

    void SPOT_LIGHT()
    {
        DIFFUSE += LIGHT_COLOR * LIGHT_ATTENUATION * SPOT_FACTOR * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR)));
    }
  • void SPECULAR_LIGHT() この関数が存在すると、シーン内のアクティブなライトごとに、フラグメントごとに呼び出されます。この関数のタスクは、書き込み可能な特殊変数SPECULAR にスペキュラの寄与を追加することです。この関数は何もしないこともでき、その場合ライトからのスペキュラ寄与は無視されます。この関数がまったく存在しない場合、ライトからの鏡面寄与は、PrincipledMaterial が行うように、通常どおり累積されます。

    この関数は、次の特殊変数に書き込むことができます:

    • vec3SPECULAR フラメントごとに、鏡面光寄与を累積します。この値を上書きすると、他のライトからの寄与が失われるため、ライトプロセッサ関数は、通常、これに (+=
    ) を
    • 追加します。

    この関数は、上記の表から、行列 (MODEL_MATRIX など

    )

    とベクトル (CAMERA_POSITION など

    )

    のユニフォームに加えて、次の特殊変数を読み込むことができます:

    • vec3LIGHT_COLOR スペキュラライトカラー。
    • floatLIGHT_ATTENUATION ライト減衰。指向性ライトの場合、値は 1.0 です。スポットライトの場合、値はvoid SPOT_LIGHT()LIGHT_ATTENUATION * SPOT_FACTOR と同じです
    • floatSHADOW_CONTRIB 影の寄与。影がまったくないか、影を受け入れない場合は 1.0。
    • vec3FRESNEL_CONTRIB 内蔵のフレネル計算によるフレネルの寄与。
    • vec3TO_LIGHT_DIR 光源を指すベクトル。
    • vec3NORMAL ワールド空間の法線ベクトル。
    • vec4BASE_COLOR ベースカラーとマテリアルのアルファ値。
    • floatMETALNESS メタルネス量。
    • floatROUGHNESS ラフネス量。
    • floatSPECULAR_AMOUNT スペキュラ量。この値は0.0から1.0の間で、カスタムMAIN 関数で設定した値と同じになります。FRESNEL_CONTRIB
    void SPECULAR_LIGHT()
    {
        vec3 H = normalize(VIEW_VECTOR + TO_LIGHT_DIR);
        float cosAlpha = max(0.0, dot(H, normalize(NORMAL)));
        float shine = pow(cosAlpha, exp2(15.0 * (1.0 - ROUGHNESS) + 1.0) * 0.25);
        SPECULAR += shine * LIGHT_COLOR * FRESNEL_CONTRIB * SHADOW_CONTRIB * LIGHT_ATTENUATION;
    }
  • void POST_PROCESS() この関数が存在する場合、フラグメントパイプラインの最後に呼び出されます。この関数のタスクは、最終的なディフューズ、スペキュラ、およびエミッシブの項で をファイナライズすることです。シェーディングされていないマテリアルの とは異なり、 はフレームバッファに書き込まれる前に自動的にトーンマッピングされます。デバッグの目的で、色として扱われるべきでない値を出力すると便利なことがあります。トーンマッピングによってこの値が歪むのを避けるために、 プロパティを に設定することで無効にすることができます。COLOR_SUM FRAGCOLOR COLOR_SUM tonemapMode TonemapModeNone

    この関数は次の特殊変数に書き込むことができます:

    • vec4 フラグメントシェーダからの出力。デフォルト値は vec4(DIFFUSE.rgb + SPECULAR + EMISSIVE, DIFFUSE.a)COLOR_SUM

    この関数は次の特殊変数を読み込むことができます。

    • vec4 フラグメントパイプラインの最終的な拡散項。DIFFUSE
    • vec3 フラグメントパイプラインの最終的なスペキュラ項。SPECULAR
    • vec3 フラグメントパイプラインの最終的なエミッシブ項。EMISSIVE
    • vec2 - バーテックスシェーダからのテクスチャ座標の最初のセット。UV0
    • vec2 - バーテックスシェーダからのテクスチャ座標の2番目のセット。UV1
    void POST_PROCESS()
    {
        float center_x = textureSize(SCREEN_TEXTURE, 0).x * 0.5;
        if (gl_FragCoord.x > center_x)
            COLOR_SUM = DIFFUSE;
        else
            COLOR_SUM = vec4(EMISSIVE, DIFFUSE.a);
    }
  • void IBL_PROBE() 存在する場合、この関数は IBL(イメージベースドライティング)のために呼び出されます。
    • SPECULAR この関数のタスクは、IBL の拡散
    • 光と
    鏡面光の寄与の両方を、書き込み可能な特殊変数 と に追加することですDIFFUSE SPECULAR

    。この関数は、次の特殊変数に書き込むことができます:

    • vec3 フラグメントごとに、拡散光の寄与をDIFFUSE
    • 累積
    • します。
  • IBL_ORIENTATION v
    • ec4 ベースカラーとマテリアルのアルファ値。BASE_COLOR
    • float スクリーン空間のオクルージョン係数。AO_FACTOR
    • float スペキュラー光量。SPECULAR_AMOUNT
    • float フラグメントパイプラインの最終的な放射項ROUGHNESS
    • vec3 ワールド空間の法線ベクトル。NORMAL
    • vec3 カメラの方向。VIEW_VECTOR
    • SceneEnvironment::probeOrientation に由来
  • します。
  • void IBL_PROBE()
    {
        vec3 smpDir = IBL_ORIENTATION * NORMAL;
        DIFFUSE += AO_FACTOR * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, smpDir, IBL_MAXMIPMAP).rgb;
    }

関数間のカスタム変数

追加の変数を MAIN 関数から他の関数に渡すことができます。新しいカスタム変数を定義するには、SHARED_VARS キーワードを使用します。これらのユーザー定義変数には、SHARED.<変数名>でアクセスできます。

例えば、陰影のあるカスタム素材は、MAINで共有値をフェッチし、他の関数で使用することができます。

SHARED_VARS {
    vec3 colorThreshold;
};
void MAIN()
{
    BASE_COLOR = texture(baseColorMap, UV0);
    SHARED.colorThreshold = texture(thresholdMap, UV0).rgb;
}
void DIRECTIONAL_LIGHT()
{
    if (DIFFUSE >= SHARED.colorThreshold) {
        DIFFUSE = SHARED.colorThreshold;
        return;
    }
    DIFFUSE += LIGHT_COLOR * SHADOW_CONTRIB;
}

注意: SHAREDはPOST_PROCESSなしですべての関数に書き込むことができますが、MAINに書き込んで他の関数で読み込むのが安全です。

注: SHAREDをLIGHT関数に書き込む推奨されるユースケースは、まずMAINでSHAREDをリセットし、次に各LIGHT関数でSHAREDを蓄積することです。

SHARED_VARS {
    float sheenIntensity;
    float sheenRoughness;
    vec3 sheenColor;
    vec3 outSheenColor;
};
void MAIN()
{
    ...
    vec4 tex = texture(uSheenMap, UV0);
    SHARED.sheenColor = tex.rgb;
    SHARED.sheenIntensity = tex.a;
    SHARED.sheenRoughness = uSheenRoughness;
    SHARED.outSheenColor = vec3(0.0);
}
void SPECULAR_LIGHT()
{
    SHARED.outSheenColor += ...;
}
void POST_PROCESS()
{
    COLOR_SUM = DIFFUSE + SPECULAR + EMISSIVE + SHARED.outSheenColor;
}

注: MAINは他の関数の前に呼ばれ、POST_PROCESSは他の関数の後に呼ばれます。

その他の特殊キーワード

カスタムフラグメントシェーダのコードは、ユニフォーム(CAMERA_DIRECTIONCAMERA_POSITION など)や、カスタム頂点シェーダから渡されたバリエーションに自由にアクセスできます。さらに、特別なキーワードとして利用可能なビルトインのバリエーショ ンが多数あります。これらのいくつかはオプショナルで、頂点シェーダMAIN が独自に計算して渡すこともできますが、重複データを減らすためにフラグメントシェーダはこれらのビルトインに依存することもできます。これらのビルトインはライトプロセッサ関数とフラグメント MAIN で利用可能です。

  • vec3VAR_WORLD_NORMAL -NORMAL_MATRIX によって変換された補間法線。
  • vec3VAR_WORLD_TANGENT -MODEL_MATRIX によって変換された補間接線.
  • vec3VAR_WORLD_BINORMAL - によって変換された補間2法線.MODEL_MATRIX
  • vec3NORMAL - 補間法線そのままのVAR_WORLD_NORMAL とは異なり、この値は両面性を調整する可能性があります:カリングを無効にしてレンダリングする場合、法線は必要に応じて反転されます。そのため、ライティングやその他の計算では、すべてのカリングモードで正しく動作するために、VAR_WORLD_NORMAL の代わりにNORMAL を使用することが推奨されます。
  • vec3TANGENT -NORMAL と同様に、この値は両面性を調整する可能性があります。カリングを無効にしてレンダリングすると、必要に応じてタンジェントが反転されます。
  • vec3BINORMAL -NORMAL と同様、この値は両面性を調整する可能性があります。カリングを無効にしてレンダリングすると、必要に応じて二法線が反転されます。
  • vec3VAR_WORLD_POSITION - 補間されたワールド空間の頂点位置((MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz )。
  • vec4VAR_COLOR - メッシュに色が指定されている場合に補間される頂点色.そうでない場合は,vec4(1.0)
  • vec3VIEW_VECTOR - カメラ方向を指します.これはCAMERA_POSITION - VAR_WORLD_POSITION ベクトルを正規化したものです。
  • vec4FRAGCOORD - 現在のフラグメントのウィンドウ相対座標を含みます。
  • floatFRAMEBUFFER_Y_UP - Y軸がフレームバッファ(テクスチャ)の座標系で上を向いているときの値は1 で、つまり(0, 0) は左下隅です。Y軸が下を向いているときの値は-1 で、(0, 0) が左上の角になります。基礎となるグラフィックスAPIにおけるこのような違いは、ほとんどのカスタムマテリアルには関係ありません。特筆すべき例外は、FRAGCOORD に基づいていないテクスチャ座標でSCREEN_TEXTURE をサンプリングすることです。SCREEN_TEXTURE の方向はもともと基礎となるグラフィックス API に結びついているため、メッシュからテクスチャ座標を使用する場合、Y 座標に適切な調整が必要になることがあります。

    たとえば、以下のフラグメントシェーダは、矩形または立方体メッシュに適し ており、シーンからの不透明オブジェクトをモデル上に表示します:

    VARYING vec2 texcoord;
    void MAIN()
    {
        vec2 screencoord = texcoord;
        if (FRAMEBUFFER_Y_UP < 0.0) // effectively: if not OpenGL
            screencoord.y = 1.0 - screencoord.y;
        BASE_COLOR = texture(SCREEN_TEXTURE, screencoord);
    }

    SCREEN_TEXTUREDEPTH_TEXTURE 以外のテクスチャをサンプリングするとき、またはFRAGCOORD がテクスチャ座標の計算に使われるとき(これはスクリーンと深度テクスチャにアクセスする典型的な使用例です)、このような調整は必要ありません。

  • floatNDC_Y_UP - この値は、正規化されたデバイス座標空間において Y 軸が上向きの場合は1 となり、Y 軸が下向きの場合は-1 となります。Y軸が下を向いているのは、Vulkanでレンダリングする場合です。ほとんどのマテリアルはこれを気にする必要はありませんが、これに基づいて分岐できることは、特定の高度なユースケースで有用になります。
  • floatNEAR_CLIP_VALUE - クリッピングプレーンの範囲が-1 から始まり1 までである場合の値は-1 です。これはレンダリングに OpenGL を使用している場合に当てはまります。他のレンダリングバックエンドでは、このプロパティの値は、クリッピングプレーンの範囲が0 から1 であることを意味する0DEPTH_TEXTURE

    たとえば、次のフラグメントシェーダは、レンダリングされている現 在の位置からの距離を決定するために、深度バッファから値の位置を 再構築するテクニックを示しています。INVERSE_PROJECTION_MATRIX と組み合わせて使用する場合、深度の値は正規化されたデバイス座標で ある必要があるため、深度の値の範囲がそれを反映していることを確認す ることが重要です。NEAR_CLIP_VALUE-1 の場合、深度値は-11 の間になるようにスケーリングされます。

    void MAIN() {
        vec2 screen_uv = FRAGCOORD.xy / vec2(textureSize(SCREEN_TEXTURE, 0));
        float depth = texture(DEPTH_TEXTURE, screen_uv).r;
    
        if (NEAR_CLIP_VALUE < 0.0) // effectively: if opengl
            depth = depth * 2.0 - 1.0;
    
        vec4 unproject = INVERSE_PROJECTION_MATRIX * vec4(screen_uv, depth, 1.0);
        depth = (unproject.xyz / unproject.w).z;
        float viewVectorZ = (VIEW_MATRIX * vec4(VAR_WORLD_POSITION, 1.0)).z;
        depth = viewVectorZ - depth;
    
        BASE_COLOR = vec4(depth, depth, depth, 1.0);
    }
  • floatIBL_EXPOSE - ライトプローブが発する光の量。これはSceneEnvironment::probeExposure に由来します。
    DIFFUSE += AO_FACTOR * IBL_EXPOSE * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
  • floatIBL_HORIZON - 下半分の環境からの反射の水平カットオフ値。Horizon Cut-Off に由来しますが、 [-1, 0) にリマップされています。
    vec3 diffuse += AO_FACTOR * IBL_EXPOSE * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
    if (IBL_HORIZON > -1.0) {
        float ctr = 0.5 + 0.5 * IBL_HORIZON;
        float vertWt = smoothstep(ctr * 0.25, ctr + 0.25, NORMAL.y);
        float wtScaled = mix(1.0, vertWt, IBL_HORIZON + 1.0);
        diffuse *= wtScaled;
    }
  • floatIBL_MAXMIPMAP - IBL_TEXTURE の最大ミップマップレベル.

インスタンス化

インスタンス化されたレンダリングを行う場合、上記のキーワードのいくつかは適用されません。以下のキーワードはインスタンス化でのみ使用できます:

  • INSTANCE_MODEL_MATRIX -> mat4、 の置き換え、インスタンス変換を含む。MODEL_MATRIX
  • INSTANCE_MODELVIEWPROJECTION_MATRIX -> mat4, 、インスタンス変換を含む。MODELVIEWPROJECTION_MATRIX
  • INSTANCE_COLOR -> vec4, インスタンスカラー: と組み合わせます。COLOR
  • INSTANCE_DATA -> インスタンスのカスタムデータ。
  • INSTANCE_INDEX -> int、インスタンス番号、インスタンステーブルへのインデックス。

スクリーン、深度、その他のテクスチャ

レンダリングパイプラインは、特別なレンダリングパスからのコンテンツで、カスタムマテリアルシェーダに多数のテクスチャを公開できます。これは、シェーディングされたカスタムマテリアルとシェーディングされていないカスタムマテリアルの両方に適用されます。

例えば、シェーダはシーン内の不透明オブジェクトの深度バッファコン テンツを含む深度テクスチャにアクセスしたい場合があります。これはDEPTH_TEXTURE をサンプリングすることで実現できます。このようなテクスチャは、本当に必要でない限り、通常は生成されません。したがって、頂点シェーダまたはフラグメントシェーダに次のキーワー ドが存在することは、問題のテクスチャを生成するための(潜在的に高価な)パ スを選択するためのトグルとしても機能します。(もちろん、SceneEnvironment のアンビエントオクルージョンパラメータなどの他の設定や、深度テクスチャに依存するポストプロセッシングエフェクトによって、これらの一部がすでに有効になっている可能性もあります。その場合、問題のテクスチャはカスタムマテリアルに関係なく生成されるため、マテリアルでこれらの特別なテクスチャをサンプリングしても、テクスチャアクセス自体は別として余分なコストはかかりません)

  • SCREEN_TEXTURE - 存在する場合、シーンの内容を含むレンダリングパスからのカラーバッファを持つテクスチャ(sampler2D またはsampler2DArray )は、透明マテリアルまたは SCREEN_TEXTURE も使用するマテリアルを除き、この名前でシェーダに公開されます。このテクスチャは、レンダリング先のフレームバッファの内容を必要とする技法に使用できます。SCREEN_TEXTURE テクスチャは、View3D と同じクリアモ ードを使用します。これらのテクスチャのサイズは、View3D のサイズとピクセル単位で一致します。たとえば、フラグメントシェーダには次のようなものがあります:
    vec2 uv = FRAGCOORD.xy / vec2(textureSize(SCREEN_TEXTURE, 0));
    vec2 displace = vec2(0.1);
    vec4 c = texture(SCREEN_TEXTURE, uv + displace);

    SCREEN_TEXTURE を使用するには、適切で意識的なシーンの設計が必要であることに注意してください。このようなマテリアルを使用するオブジェクトは注意深く配置する必要があり、通常、テクスチャに表示されることが予想される他のすべてのオブジェクトの上に配置します。何らかの形で半透明を使用するオブジェクトは、決してSCREEN_TEXTURE の一部にはなりません。多くの場合、SCREEN_TEXTUREBASE_COLOR と組み合わせてMAIN で使用されます。たとえば、次のカスタムフラグメントシェーダは、不透明オブジェクトに 触れていないフラグメントを透明に保ちながら、エンボス効果を適用します。

    void MAIN()
    {
        vec2 size = vec2(textureSize(SCREEN_TEXTURE, 0));
        vec2 uv = FRAGCOORD.xy / size;
    
        // basic emboss effect
        vec2 d = vec2(1.0 / size.x, 1.0 / size.y);
        vec4 diff = texture(SCREEN_TEXTURE, uv + d) - texture(SCREEN_TEXTURE, uv - d);
        float c = (diff.x + diff.y + diff.z) + 0.5;
    
        float alpha = texture(SCREEN_TEXTURE, uv).a;
        BASE_COLOR = vec4(vec3(c), alpha);
    }

    マルチビューレンダリングではSCREEN_TEXTUREsampler2DArray です

    VIEW_INDEX を使用して、使用するレイヤーを選択します。両方のタイプのレンダリングをサポートしたい VR/AR アプリケーションの場合、ポータブルなアプローチは次のとおりです:

    #if QSHADER_VIEW_COUNT >= 2
        vec4 c = texture(SCREEN_TEXTURE, vec3(uv, VIEW_INDEX));
    #else
        vec4 c = texture(SCREEN_TEXTURE, uv);
    #endif
  • SCREEN_MIP_TEXTURE - ほとんどの点でSCREEN_TEXTURE と同じですが、このテクスチャにはミップマップが生成されるという違いがあります。これは、画面サイズに依存し、シーンがレンダリングされるたびにミップマップを生成しなければならないため、パフォーマンス的に高価な機能になる可能性があります。したがって、テクスチャのミップレベルに依存する技法(シェーダでtextureLod を使用するなど)がカスタムマテリアルによって実装されていない限り、常にSCREEN_TEXTURE を使用することをお勧めします。
  • DEPTH_TEXTURE - 存在する場合、(非線形化された)深度バッファの内容を持つテクスチャ(sampler2D またはsampler2DArray )は、この名前でシェーダに公開されます。不透明なオブジェクトだけが含まれます。たとえば、フラグメントシェーダには以下が含まれます:
    ivec2 dtSize = textureSize(DEPTH_TEXTURE, 0);
    vec2 dtUV = (FRAGCOORD.xy) / vec2(dtSize);
    vec4 depthSample = texture(DEPTH_TEXTURE, dtUV);
    float zNear = CAMERA_PROPERTIES.x;
    float zFar = CAMERA_PROPERTIES.y;
    float zRange = zFar - zNear;
    float z_n = 2.0 * depthSample.r - 1.0;
    float d = 2.0 * zNear * zFar / (zFar + zNear - z_n * zRange);
    d /= zFar;

    マルチビューレンダリングではDEPTH_TEXTUREsampler2DArray です

    使用するレイヤーを選択するには、VIEW_INDEX を使用します。両方のタイプのレンダリングをサポートしたい VR/AR アプリケーションの場合、ポー タブルなアプローチは次のようになります:

    #if QSHADER_VIEW_COUNT >= 2
        vec4 depthSample = texture(DEPTH_TEXTURE, vec3(uv, VIEW_INDEX));
    #else
        vec4 depthSample = texture(DEPTH_TEXTURE, uv);
    #endif
  • AO_TEXTURE -SceneEnvironment でスクリーン空間アンビエントオクルージョンが有効になっているとき(AO 強度と距離がともにゼロでないときを意味する)、SSAO テクスチャ(sampler2D またはsampler2DArray )がこの名前でシェーダに公開されます。このテクスチャをサンプリングすると、シェーディングされていないマテリア ルで役立ちます。シェーディングされたマテリアルにはアンビエントオクルージョンサポートが 組み込まれています。つまり、アンビエントオクルージョン要素が自動的に考慮されます。一方、シェーディングされていないマテリアルのフラグメントシェーダでは、同じことを達成するために次のように書くことができます:
    ivec2 aoSize = textureSize(AO_TEXTURE, 0);
    vec2 aoUV = (FRAGCOORD.xy) / vec2(aoSize);
    float aoFactor = texture(AO_TEXTURE, aoUV).x;

    マルチビューレンダリングではAO_TEXTURE は、sampler2DArray. 使用するレイヤーを選択するには、VIEW_INDEX を使用します。両方のタイプのレンダリングをサポートしたい VR/AR アプリケーションの場合、移植可能な アプローチは次のようになります:

    #if QSHADER_VIEW_COUNT >= 2
        ivec2 aoSize = textureSize(AO_TEXTURE, 0).xy;
        vec2 aoUV = (FRAGCOORD.xy) / vec2(aoSize);
        float aoFactor = texture(AO_TEXTURE, vec3(aoUV, VIEW_INDEX)).x;
    #else
        ivec2 aoSize = textureSize(AO_TEXTURE, 0);
        vec2 aoUV = (FRAGCOORD.xy) / vec2(aoSize);
        float aoFactor = texture(AO_TEXTURE, aoUV).x;
    #endif
  • IBL_TEXTURE - これは特別なレンダリングパスを有効にするものではありませんが、マテリアルが 、またはモデルが の範囲内にある場合に使用できます。Material::lightProbe SceneEnvironment::lightProbe
    void IBL_PROBE()
    {
        DIFFUSE += AO_FACTOR * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
    }
  • VIEW_INDEX - カスタムシェーダコードで使用する場合、これは(非補間) uint 変数です。マルチビューレンダリングを使用しない場合、値は常に 0 です。マルチビューレンダリングを使用する場合、値は現在のビューインデッ クス(例えば、gl_ViewIndex)になります。マルチビューレンダリングが有効な場合、特に などと組み合わせると便利です。DEPTH_TEXTURE

SceneEnvironment::tonemapModeUsing Image-Based LightingQt Quick 3D - Custom Shaders ExampleQt Quick 3D - Custom Materials ExampleProgrammable Materials、Effects、Geometry、Texture dataも参照してください

プロパティ ドキュメント

alwaysDirty : bool

マテリアルの状態が常にダーティであることを指定します。これは、マテリアルがQtQuick3D で使用されるたびにリフレッシュされる必要があることを示します。


destinationAlphaBlend : enumeration [since 6.7]

デスティネーションのアルファブレンド係数を指定します。デフォルト値はCustomMaterial.NoBlend です。この値は、sourceBlend およびdestinationBlend がデフォルト以外の値に設定されている場合にのみ、積極的に使用されます。

定数
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

注: 後方互換性のために、デフォルト値のままにしておくと、sourceBlenddestinationBlend がデフォルト値以外に設定されているときに、destinationBlend と同じ値が割り当てられます。

このプロパティは Qt 6.7 で導入されました。

destinationBlendも参照してください


destinationBlend : enumeration

デスティネーションのブレンド係数を指定します。デフォルト値はCustomMaterial.NoBlend です。

定数
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

注意: ブレンドを有効にする前に、sourceBlend と destinationBlend の両方をデフォルト以外の値に設定する必要があります。

sourceBlendも参照してください


fragmentShader : url

カスタムフラグメントシェーダーコードのスニペットを含むファイルを指定します。

値は URL で、ローカルファイルであるか、Qt リソースシステム経由で埋め込まれたファイルにアクセスするために qrc スキームを使用する必要があります。相対ファイルパス(スキームなし)も受け付けます。この場合、ファイルはコンポーネント(.qml ファイル)からの相対ファイルとして扱われます。

vertexShaderも参照してください


lineWidth : real

このプロパティは、ジオメトリがプリミティブタイプのラインまたはラインストリップを使用している場合に、レンダリングされるラインの幅を決定します。デフォルト値は 1.0 です。このプロパティは、三角形メッシュなど、他のタイプのジオメトリをレンダリングするときには関係ありません。

警告 基礎となるグラフィックスAPIによっては、1以外の線幅が実行時にサポートされない場合があります。その場合、幅の変更要求は無視されます。たとえば、以下のいずれでも幅の広い線はサポートされません:Direct3D、Metal、コア・プロファイル・コンテキストを持つOpenGL。

注意: グラフィックスパイプラインオブジェクトの一部である線幅とは異なり、点のトポロジーを持つジオメトリの点サイズは(サポートされている場合)バーテックスシェーダによって制御されるため、対応する QML プロパティはありません。


shadingMode : enumeration

マテリアルのタイプを指定します。デフォルト値は Shaded です。

定数
CustomMaterial.Unshaded
CustomMaterial.Shaded

sourceAlphaBlend : enumeration [since 6.7]

ソースのアルファブレンド係数を指定します。デフォルト値はCustomMaterial.NoBlend です。この値は、sourceBlenddestinationBlend がデフォルト以外の値に設定されている場合にのみ、積極的に使用されます。

定数
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

注: 後方互換性のために、デフォルト値のままにしておくと、sourceBlenddestinationBlend がデフォルト値以外に設定されているときに、sourceBlend と同じ値が割り当てられます。

このプロパティは Qt 6.7 で導入されました。

sourceBlendも参照してください


sourceBlend : enumeration

ソースのブレンド係数を指定します。デフォルト値はCustomMaterial.NoBlend です。

定数
CustomMaterial.NoBlend
CustomMaterial.Zero
CustomMaterial.One
CustomMaterial.SrcColor
CustomMaterial.OneMinusSrcColor
CustomMaterial.DstColor
CustomMaterial.OneMinusDstColor
CustomMaterial.SrcAlpha
CustomMaterial.OneMinusSrcAlpha
CustomMaterial.DstAlpha
CustomMaterial.OneMinusDstAlpha
CustomMaterial.ConstantColor
CustomMaterial.OneMinusConstantColor
CustomMaterial.ConstantAlpha
CustomMaterial.OneMinusConstantAlpha
CustomMaterial.SrcAlphaSaturate

注意: ブレンドを有効にする前に、sourceBlend とdestinationBlend の両方をデフォルト以外の値に設定する必要があります。

destinationBlendも参照してください


vertexShader : url

カスタム頂点シェーダーコードのスニペットを含むファイルを指定します。

値は URL で、ローカルファイルであるか、qrc スキームを使用して Qt リソースシステム経由で埋め込まれたファイルにアクセスする必要があります。相対ファイルパス(スキームなし)も受け付けます。この場合、ファイルはコンポーネント(.qml ファイル)からの相対ファイルとして扱われます。

fragmentShaderも参照してください


© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.