CustomMaterial QML Type
モデルのシェーディングに使用するカスタムマテリアルを作成するためのベースコンポーネントです。詳細...
Import Statement: | import QtQuick3D |
Inherits: |
プロパティ
- alwaysDirty : bool
- destinationAlphaBlend : enumeration
(since 6.7)
- destinationBlend : enumeration
- fragmentShader : url
- lineWidth : real
- shadingMode : enumeration
- sourceAlphaBlend : enumeration
(since 6.7)
- sourceBlend : enumeration
- vertexShader : url
詳細説明
カスタムマテリアルを使用すると、マテリアルにカスタムシェーダコードを使用できるようになり、グラフィックスシェーダレベルでプログラム可能になります。頂点シェーダ、フラグメントシェーダ、またはその両方のシェーダを指定できます。vertexShader およびfragmentShader プロパティは URL で、シェーダースニペットを含むファイルを参照し、ShaderEffect またはImage.source と非常によく似た動作をします。カスタムマテリアルでサポートされているのは、file
とqrc
のスキームのみです。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.vert
とmaterial.frag
のシェーダースニペットを次のように仮定しましょう:
void MAIN() { VERTEX.x += sin(uTime + VERTEX.y) * uAmplitude; } | void MAIN() { BASE_COLOR = vec4(0.0, 1.0, 0.0, 1.0); } |
uTime
とuAmplitude
が CustomMaterial 要素のプロパティであることに注目してください。これらは値を変更することができ、普通にアニメートされ、開発者が何もしなくても自動的にシェーダに値が公開されます。
その結果、頂点がアニメーションする円柱ができます:
2種類のカスタムマテリアル
カスタムマテリアルには主に2つの種類があります。これはshadingMode プロパティで指定します。unshaded カスタムマテリアルでは、フラグメントシェーダはシーン内のライト、ライトプローブ、シャドウイングを無視して、単一のvec4
カラーを出力します。shaded マテリアルでは、シェーダは特定の関数を実装し、組み込み変数と連携して、ライティングとシャドウの寄与を考慮することが期待されます。
デフォルトの選択は一般的にシェーディングマテリアルで、これはshadingMode プロパティのデフォルト値に反映されています。これは、頂点やジオメトリから入力されるその他のデータを変換したり、BASE_COLOR
やEMISSIVE_COLOR
のような値をカスタムで決定する必要があるマテリアルに適しています。おそらく、SCREEN_TEXTURE
やDEPTH_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以外に設定すると、フラグメントの最終的なアルファ値に影響を与えることができます。(この場合、sourceBlend とdestinationBlend でアルファブレンディングを有効にする必要があります。)もう一つのシナリオは、カスタム
SPECULAR_LIGHT
関数が提供されていない場合、またはSceneEnvironment にライトプローブが設定されている場合です。 金属性、粗さ、および鏡面寄与計算に影響するその他の値は、MAIN
で希望のカスタム値に設定できます。この関数は、以下の特殊変数に書き込むことができます。これらに書き込まれる値は通常、ハードコードされるか、ユニフォームにマッピングされたQMLプロパティに基づいて計算されます。セマンティクスはPrincipledMaterial と同じです。
- vec4
BASE_COLOR
- ベースカラーとマテリアルのアルファ値。built-in materials' color property に対応します。 ライトプロセッサファンクションが実装されていない場合、MAIN
でカスタムベースカラーを設定すると、デフォルトのライティング計算に反映されるため便利です。デフォルト値はvec4(1.0)
で、アルファ値 1.0 の白を意味します。アルファ値はフラグメントの最終的なアルファ値に影響します。最終的なアルファ値は、オブジェクト (モデル) の不透明度にベースカラーのアルファ値を掛けたものになります。QMLのカラープロパティから公開される一様な値に頼らず、シェーダコードで直接値を指定する場合、必要に応じてsRGBからリニアへの変換を行うのはシェーダ次第であることに注意してください。たとえば、vec3 color
とfloat 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);
- vec3
EMISSIVE_COLOR
- 自己照明の色。組み込みマテリアルの発光色に対応し、built-in materials's emissiveFactor property とbuilt-in materials's emissiveMap property で合成されます。デフォルト値はvec3(0.0)
です。QML のカラープロパティから公開される一様な値に頼らず、シェーダコードで直接値を指定する場合、必要に応じて sRGB から線形への変換を行うのはシェーダ次第であることに注意してください。 - float
IOR
マテリアルの屈折率を指定します。一般的な値は1.5
で、デフォルトはPrincipledMaterial です。 - float
TRANSMISSION_FACTOR
半透明の量を指定します。一般的な値は1.0
で、デフォルトはPrincipledMaterial なので0.0
です。 - float
THICKNESS_FACTOR
半透明材料の厚さを指定します。一般的な値は10.0
で、デフォルトはPrincipledMaterial である0.0
です。 - vec3
ATTENUATION_COLOR
半透明マテリアルの距離による色のずれを指定します。一般的な値はvec3(1.0, 0.0, 0.0)
で、デフォルトはPrincipledMaterial であるvec3(1.0)
です。 - float
ATTENUATION_DISTANCE
半透明材料のカラーシフトの距離減衰を指定します。一般的な値は100.0
で、デフォルトはPrincipledMaterial である0.0
です。 - float
METALNESS
金属感の量を 0.0 - 1.0 の範囲で指定します。デフォルト値は0。効果を得るには0以外の値に設定する必要がある。 - float
ROUGHNESS
0.0 - 1.0 の範囲のラフネス値。デフォルト値は 0。 - float
CLEARCOAT_FRESNEL_POWER
クリアコート層のフレネルパワーを指定します。一般的な値は5.0
で、デフォルト値もPrincipledMaterial です。 - float
CLEARCOAT_FRESNEL_SCALE
クリアコート層のフレネルスケールを指定します。典型的な値は1.0
で、デフォルトもPrincipledMaterial です。 - float
CLEARCOAT_FRESNEL_BIAS
クリアコート層のフレネルバイアスを指定します。一般的な値で、デフォルトもPrincipledMaterial で使用される0.0
です。 - float
CLEARCOAT_AMOUNT
材料の上にあるクリアコート層の量を指定します。一般的な値は1.0
で、デフォルトはPrincipledMaterial である0.0
です。 - float
CLEARCOAT_ROUGHNESS
クリアコート層の粗さを指定します。典型的な値は、完全にぼかしたクリアコート層の場合は1.0
で、デフォルトはPrincipledMaterial のように0.0
です。 - vec3
CLEARCOAT_NORMAL
- ワールド空間の頂点シェーダから来るクリアコートレイヤーの法線。このプロパティの初期値はVAR_WORLD_NORMAL
と同じですが、CLEARCOAT_NORMAL
の値を変更するだけで、クリアコートレイヤーの法線に影響を与えます。 - float
FRESNEL_POWER
フレネルパワーを指定します。一般的な値は5.0
で、デフォルトはPrincipledMaterial です。 - float
FRESNEL_SCALE
フレネルスケールを指定します。典型的な値で、デフォルトもPrincipledMaterial で使用される1.0
である。 - float
FRESNEL_BIAS
フレネルバイアスを指定します。典型的な値は0.0
で、デフォルトもPrincipledMaterial です。 - float
SPECULAR_AMOUNT
スペキュラ量を 0.0 - 1.0 の範囲で指定します。デフォルト値は0.5
で、PrincipledMaterial::specularAmount と一致します。0 以外の値に設定 し なければ効果があ り ません。 - float
OCCLUSION_AMOUNT
AO 係数を指定します。一般的な値は1.0
であり、デフォルト値もPrincipledMaterial である。 - vec3
NORMAL
- ワールド空間の頂点シェーダから来る法線。このプロパティの初期値はVAR_WORLD_NORMAL
と同じですが、ライティングに影響を与えるのはNORMAL
の値を変更した場合のみです。 - vec3
TANGENT
- ワールド空間の頂点シェーダから来る接線。この値は両面性が調整される可能性があります。 - vec3
BINORMAL
- ワールド空間の頂点シェーダから来る二法線。この値は両面性が調整される可能性があります。 - vec2
UV0
- バーテックスシェーダーからのテクスチャ座標の最初のセット。このプロパティはフラグメントシェーダでは読み取り専用です。 - vec2
UV1
- バーテックスシェーダからのテクスチャ座標の 2 番目のセット。このプロパティはフラグメントシェーダでは読み取り専用です。
注意: シェーディングされていないマテリアルとは異なり、シェーディングされたマテリアルのフラグメント
MAIN
はFRAGCOLOR
を直接制御することはできません。むしろ、最終的なフラグメントの色を決定するのは、ライトプロセッサ関数に書かれたDIFFUSE
とSPECULAR
の値です。ライトプロセッサ関数が実装されていない場合、関連するデフォルトのシェーディング計算が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); }
- vec4
void AMBIENT_LIGHT()
存在する場合、この関数は各フラグメントに対して1回呼び出されます。この関数のタスクは、アンビエント寄与の合計を書き込み可能な特殊変数 に追加することです。もちろん、別の値を計算することも、 にまったく触れない(アンビエントライティングを完全に無視する)こともできます。この関数が全く存在しない場合は、 が行うように、アンビエント寄与は普通に計算されます。DIFFUSE
DIFFUSE
PrincipledMaterialこの関数は以下の特殊変数に書き込むことができます:
- vec3
DIFFUSE
ディフューズ光の寄与をフラグメントごとに累積します。この値を上書きすると他のライトからの寄与が失われるため、ライトプロセッサ関数は通常これに (+=
) を追加します。
この関数は、上の表にあるマトリックス(
MODEL_MATRIX
など)やベクトル(CAMERA_POSITION
など)に加えて、以下の特殊変数を読み込むことができます:- vec3
TOTAL_AMBIENT_COLOR
シーン内のアンビエント寄与の合計。
例:
void AMBIENT_LIGHT() { DIFFUSE += TOTAL_AMBIENT_COLOR; }
- vec3
void DIRECTIONAL_LIGHT()
例:この関数が存在する場合、各フラグメントのシーン内の各アクティブディレクショナルライトに対して呼び出されます。この関数のタスクは、書き込み可能な特殊変数 にディフューズ寄与を追加することです。この関数は何もしないこともでき、その場合、指向性ライトからのディフューズ寄与は無視されます。この関数が全く存在しない場合、指向性ライトからの拡散寄与は、 が行うように、普通に累積される。DIFFUSE
PrincipledMaterialこの関数は、以下の特殊変数に書き込むことができる:
- vec3
DIFFUSE
ディフューズ光の寄与をフラグメントごとに累積します。この値を上書きすると他のライトからの寄与が失われるため、ライトプロセッサー関数は通常これに (+=
) を追加します。
この関数は、上の表にあるマトリックス(
MODEL_MATRIX
など)やベクトル(CAMERA_POSITION
など)に加えて、以下の特殊変数を読み込むことができます:- vec3
LIGHT_COLOR
拡散光色。 - float
SHADOW_CONTRIB
影の寄与率。 影がまったくないか、 影を受け入れない場合は 1.0。 - vec3
TO_LIGHT_DIR
光源を指すベクトル。 - vec3
NORMAL
ワールド空間の法線ベクトル。 - vec4
BASE_COLOR
ベースカラーとマテリアルのアルファ値です。 - float
METALNESS
メタルネス量。 - float
ROUGHNESS
ラフネス量。
例
void DIRECTIONAL_LIGHT() { DIFFUSE += LIGHT_COLOR * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR))); }
- vec3
void POINT_LIGHT()
この関数が存在する場合、各フラグメントのシーン内の各アクティブポイントライトに対して呼び出されます。この関数のタスクは、書き込み可能な特殊変数 にディフューズ寄与を追加することです。この関数は何もしないこともでき、その場合ポイントライトからのディフューズ寄与は無視されます。関数が全く存在しない場合、点光源からの拡散寄与は、 が行うように、普通に累積される。DIFFUSE
PrincipledMaterialこの関数は、以下の特殊変数に書き込むことができます:
- vec3
DIFFUSE
ディフューズ光の寄与をフラグメントごとに累積します。
この関数は、上の表にあるマトリックス(
MODEL_MATRIX
など)とベクトル(CAMERA_POSITION
など)のユニフォームに加えて、次の特殊変数を読み込むことができます:- vec3
LIGHT_COLOR
拡散光色。 - float
LIGHT_ATTENUATION
光の減衰。 - float
SHADOW_CONTRIB
影の寄与。 影がまったくないか、 影を受け入れない場合は 1.0。 - vec3
TO_LIGHT_DIR
光源を指すベクトル。 - vec3
NORMAL
ワールド空間の法線ベクトル。 - vec4
BASE_COLOR
ベースカラーとマテリアルのアルファ値です。 - float
METALNESS
メタルネス量。 - float
ROUGHNESS
ラフネス量。
例
void POINT_LIGHT() { DIFFUSE += LIGHT_COLOR * LIGHT_ATTENUATION * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR))); }
- vec3
void SPOT_LIGHT()
この関数が存在する場合、各フラグメントのシーン内の各アクティブスポットライトに対して呼び出されます。この関数のタスクは、書き込み可能な特殊変数 にディフューズ寄与を追加することです。この関数は何もしないこともでき、その場合、スポットライトからのディフューズ寄与は無視されます。関数が全く存在しない場合、スポットライトからの拡散寄与は、 が行うように、普通に蓄積される。DIFFUSE
PrincipledMaterialこの関数は、以下の特殊変数に書き込むことができる:
- vec3
DIFFUSE
ディフューズ光の寄与をフラグメントごとに累積します。
この関数は、上の表からマトリックス(
MODEL_MATRIX
など)とベクトル(CAMERA_POSITION
など)のユニフォームに加えて、以下の特殊変数を読み込むことができます:- vec3
LIGHT_COLOR
拡散光色。 - float
LIGHT_ATTENUATION
光の減衰。 - float
SHADOW_CONTRIB
影の寄与。 影がまったくないか、 影を受け入れない場合は 1.0。 - vec3
TO_LIGHT_DIR
光源を指すベクトル。 - float
SPOT_FACTOR
スポット光係数。 - vec3
NORMAL
ワールド空間の法線ベクトル。 - vec4
BASE_COLOR
ベースカラーとマテリアルのアルファ値。 - float
METALNESS
メタルネス量。 - float
ROUGHNESS
ラフネス量。
例
void SPOT_LIGHT() { DIFFUSE += LIGHT_COLOR * LIGHT_ATTENUATION * SPOT_FACTOR * SHADOW_CONTRIB * vec3(max(0.0, dot(normalize(VAR_WORLD_NORMAL), TO_LIGHT_DIR))); }
- vec3
void SPECULAR_LIGHT()
この関数が存在する場合、各フラグメントのシーン内の各アクティブライトに対して呼び出されます。この関数のタスクは、書き込み可能な特殊変数 にスペキュラ寄与を追加することです。この関数は何もしないこともでき、その場合ライトからのスペキュラ寄与は無視されます。この関数が全く存在しない場合、ライトからの鏡面寄与は、 が行うように、普通に蓄積されます。SPECULAR
PrincipledMaterialこの関数は、以下の特殊変数に書き込むことができます:
- vec3
SPECULAR
フラメントごとの鏡面光寄与を累積します。この値を上書きすると他のライトからの寄与が失われるため、ライトプロセッサ関数は通常これに (+=
) を追加します。
この関数は、上表のマトリックス(
MODEL_MATRIX
など)やベクトル(CAMERA_POSITION
など)に加えて、以下の特殊変数を読み込むことができます:- vec3
LIGHT_COLOR
スペキュラ光源色。 - float
LIGHT_ATTENUATION
光の減衰。指向性ライトの場合、値は1.0です。スポットライトの場合、値はvoid SPOT_LIGHT()
のLIGHT_ATTENUATION * SPOT_FACTOR
と同じです。 - float
SHADOW_CONTRIB
影の寄与。 影がまったくないか、 影を受け入れない場合は 1.0。 - vec3
FRESNEL_CONTRIB
内蔵のフレネル計算によるフレネル寄与。 - vec3
TO_LIGHT_DIR
光源を指すベクトル。 - vec3
NORMAL
ワールド空間の法線ベクトルです。 - vec4
BASE_COLOR
ベースカラーとマテリアルのアルファ値です。 - float
METALNESS
メタルネス量。 - float
ROUGHNESS
ラフネス量。 - float
SPECULAR_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; }
- vec3
void POST_PROCESS()
この関数は、フラグメントパイプラインの最後に呼び出されます。この関数のタスクは、最終的な拡散項、鏡面項、および放射項を使用して を最終化することです。シェーディングされていないマテリアルの とは異なり、 はフレームバッファに書き込まれる前に自動的にトーンマッピングされます。デバッグの目的で、色として扱われるべきでない値を出力すると便利なことがあります。トーンマッピングがこの値を歪めるのを避けるために、 プロパティを次のように設定することで無効にできます。COLOR_SUM
FRAGCOLOR
COLOR_SUM
tonemapModeTonemapModeNone
この関数は、以下の特殊変数に書き込むことができます:
- vec4
COLOR_SUM
フラグメントシェーダからの出力。デフォルト値は vec4(DIFFUSE.rgb + SPECULAR + EMISSIVE, DIFFUSE.a) です。
この関数は、以下の特殊変数を読み込むことができます。
- vec4
DIFFUSE
フラグメントパイプラインの最終拡散項。 - vec3
SPECULAR
フラグメントパイプラインの最終スペキュラ項。 - vec3
EMISSIVE
フラグメントパイプラインの最終的な放射項。 - vec2
UV0
- バーテックスシェーダからのテクスチャ座標の最初のセット。 - vec2
UV1
- バーテックスシェーダからのテクスチャ座標の 2 番目のセット。
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); }
- vec4
void IBL_PROBE()
この関数がある場合、IBL(イメージベースドライティング)のために呼び出されます。この関数のタスクは、書き込み可能な特殊変数 と に IBL のディフューズとスペキュラの両方の寄与を追加することです。DIFFUSE
SPECULAR
この関数は、以下の特殊変数に書き込むことができます:
- vec3
DIFFUSE
フラグメント毎の拡散光寄与を累積します. - vec3
SPECULAR
フラグメント毎の鏡面光寄与を累積する.
この関数は,以下の特殊変数を読み込むことができます.
- vec4
BASE_COLOR
ベースカラーとマテリアルのアルファ値。 - float
AO_FACTOR
スクリーン空間オクルージョン係数。 - float
SPECULAR_AMOUNT
スペキュラ量。 - float
ROUGHNESS
フラグメントパイプラインの最終エミッシブ項。 - vec3
NORMAL
ワールド空間の法線ベクトルです。 - vec3
VIEW_VECTOR
カメラ方向を指します。 - mat3
IBL_ORIENTATION
ライトプローブの向き。SceneEnvironment::probeOrientation に由来します。
void IBL_PROBE() { vec3 smpDir = IBL_ORIENTATION * NORMAL; DIFFUSE += AO_FACTOR * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, smpDir, IBL_MAXMIPMAP).rgb; }
- vec3
関数間のカスタム変数
追加の変数を 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に書き込んで他の関数で読み込むのが安全です。
注: LIGHT関数にSHAREDを書き込む場合の推奨される使用例は、まず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_DIRECTION
やCAMERA_POSITION
など)や、カスタム頂点シェーダから渡されたバリエーションに自由にアクセスできます。さらに、特別なキーワードとして利用可能なビルトインのバリエーショ ンが多数あります。これらのいくつかはオプショナルで、頂点シェーダMAIN
が独自に計算して渡すこともできますが、重複データを減らすためにフラグメントシェーダはこれらのビルトインに依存することもできます。これらのビルトインはライトプロセッサ関数とフラグメント MAIN で利用可能です。
- vec3
VAR_WORLD_NORMAL
-NORMAL_MATRIX
によって変換された補間法線。 - vec3
VAR_WORLD_TANGENT
-MODEL_MATRIX
によって変換された補間接線. - vec3
VAR_WORLD_BINORMAL
- によって変換された補間2法線.MODEL_MATRIX
- vec3
NORMAL
- 補間法線そのままのVAR_WORLD_NORMAL
とは異なり、この値は両面性を調整する可能性があります:カリングを無効にしてレンダリングする場合、法線は必要に応じて反転されます。そのため、ライティングやその他の計算では、すべてのカリングモードで正しく動作するために、VAR_WORLD_NORMAL
の代わりにNORMAL
を使用することが推奨されます。 - vec3
TANGENT
-NORMAL
と同様に、この値は両面性を調整する可能性があります。カリングを無効にしてレンダリングすると、必要に応じてタンジェントが反転されます。 - vec3
BINORMAL
-NORMAL
と同様、この値は両面性を調整する可能性があります。カリングを無効にしてレンダリングすると、必要に応じて二法線が反転されます。 - vec3
VAR_WORLD_POSITION
- 補間されたワールド空間の頂点位置((MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz
)。 - vec4
VAR_COLOR
- メッシュに色が指定されている場合に補間される頂点色.そうでない場合は,vec4(1.0)
. - vec3
VIEW_VECTOR
- カメラ方向を指します.これはCAMERA_POSITION - VAR_WORLD_POSITION
ベクトルを正規化したものです。 - vec4
FRAGCOORD
- 現在のフラグメントのウィンドウ相対座標を含みます。 (0, 0)
floatFRAMEBUFFER_Y_UP
- Y軸がフレームバッファ(テクスチャ)の座標系で上を向いている場合、値は1
になります。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_TEXTURE
とDEPTH_TEXTURE
以外のテクスチャをサンプリングするとき、またはFRAGCOORD
がテクスチャ座標の計算に使われるとき(これはスクリーンと深度テクスチャにアクセスする典型的な使用例です)、このような調整は必要ありません。- float
NDC_Y_UP
- この値は、正規化されたデバイス座標空間において Y 軸が上向きの場合は1
となり、Y 軸が下向きの場合は-1
となります。Y軸が下を向いているのは、Vulkanでレンダリングする場合です。ほとんどのマテリアルはこれを気にする必要はありませんが、これに基づいて分岐できることは、特定の高度なユースケースで有用になります。 - float
NEAR_CLIP_VALUE
- クリッピングプレーンの範囲が-1
から始まり1
までである場合の値は-1
です。これはレンダリングに OpenGL を使用している場合に当てはまります。他のレンダリングバックエンドでは、このプロパティの値は、クリッピングプレーンの範囲が0
から1
であることを意味する0
。DEPTH_TEXTURE
たとえば、次のフラグメントシェーダは、レンダリングされている現 在の位置からの距離を決定するために、深度バッファから値の位置を 再構築するテクニックを示しています。
INVERSE_PROJECTION_MATRIX
と組み合わせて使用する場合、深度の値は正規化されたデバイス座標で ある必要があるため、深度の値の範囲がそれを反映していることを確認す ることが重要です。NEAR_CLIP_VALUE
が-1
の場合、深度値は-1
と1
の間になるようにスケーリングされます。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); }
- float
IBL_EXPOSE
- ライトプローブが発する光の量。これはSceneEnvironment::probeExposure に由来します。DIFFUSE += AO_FACTOR * IBL_EXPOSE * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb;
- float
IBL_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; }
- float
IBL_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
- 存在する場合、シーンの内容を含むレンダリングパスからのカラーバッファを持つテクスチャ( または )は、透明マテリアルまたは SCREEN_TEXTURE も使用するマテリアルを除き、この名前でシェーダに公開されます。このテクスチャは、レンダリング先のフレームバッファの内容を必要とする技法に使用できます。SCREEN_TEXTURE テクスチャは、 と同じクリアモ ードを使用します。これらのテクスチャのサイズは、 のサイズとピクセル単位で一致します。たとえば、フラグメントシェーダには次のようなものがあります:sampler2D
sampler2DArray
View3D View3Dvec2 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_TEXTURE
はBASE_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_TEXTURE
は、sampler2DArray
. 使用するレイヤーを選択するには、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_TEXTURE
は、sampler2DArray
. 使用するレイヤーを選択するには、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
- 存在し、 でスクリーン空間アンビエントオクルージョン が有効になっている場合(AO 強度と距離が両方ともゼロでない場合を意 味します)、SSAO テクスチャ( または )は、この名前でシェーダに公開されます。このテクスチャをサンプリングすると、シェーディングされていないマテリア ルで役に立ちます。シェーデッドマテリアルにはアンビエントオクルージョンサポートが 組み込まれています。つまり、アンビエントオクルージョン要素が自動的に考慮されます。一方、シェーディングされていないマテリアルのフラグメントシェーダでは、同じことを達成するために次のように書くことができます:SceneEnvironmentsampler2D
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::lightProbevoid IBL_PROBE() { DIFFUSE += AO_FACTOR * BASE_COLOR.rgb * textureLod(IBL_TEXTURE, NORMAL, IBL_MAXMIPMAP).rgb; }
VIEW_INDEX
- カスタムシェーダコードで使用する場合、これは(補間されない) uint 変数になります。マルチビューレンダリングを使用しない場合、値は常に 0 です。マルチビューレンダリングでは、値は現在のビューインデックスになります(例: gl_ViewIndex)。マルチビューレンダリングが有効な場合、特に などと組み合わせると便利です。DEPTH_TEXTURE
SceneEnvironment::tonemapMode 、Using Image-Based Lighting、Qt Quick 3D - Custom Shaders Example、Qt Quick 3D - Custom Materials Example、Programmable Materials、Effects、Geometry、Texture dataも参照してください 。
プロパティの説明
destinationAlphaBlend : enumeration |
デスティネーションのアルファブレンド係数を指定します。デフォルト値は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 |
注: 後方互換性のために、デフォルト値のままにしておくと、sourceBlend とdestinationBlend がデフォルト値以外に設定されているときに、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 |
ソースのアルファブレンド係数を指定します。デフォルト値は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 |
注: 後方互換性のために、デフォルト値のままにしておくと、sourceBlend とdestinationBlend がデフォルト値以外に設定されているときに、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も参照して ください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。