シェーダーを編集する¶
Kanzi Studio プロジェクトでは、シェーダープログラムはコンピュータのハードドライブにファイルとして保存されます。シェーダーを Kanzi Studio プロジェクトの <KanziWorkspace>/Projects/<ProjectName>/Shaders ディレクトリに追加すると、Kanzi Studio は自動的にそれらを Library > Resource Files > Shaders に表示します。
シェーダーファイルへのアクセスは、すべての標準マテリアルタイプをフラグメントベースのシェーダーからバーテックスベースのシェーダーに、またはその逆に変更したい場合に便利です。ファイル名が同じである場合、これを行うには、ファイルシステム上でシェーダーファイルを正しいバージョンに置き換えてください。
独自のシェーダーの作成を始めるには、Kanzi マテリアルライブラリから適切なマテリアルタイプを出発点として使用し、シェーダーとマテリアルのプロパティを変更できます。マテリアルタイプの使用 を参照してください。
コードを記述する代わりにビジュアルにシェーダーを作成するには、シェーダーグラフ を参照してください。
Kanzi Studio Shader Source Editor¶
Kanzi Studio Shader Source Editor を使用して、シェーダーのソースコードを編集できます。Kanzi Studio Shader Source Editor を扱う際には、次の点に注意してください。
エディタは変更をディスクに保存します。つまり、変更を保存せずにプロジェクトを閉じても、シェーダーファイルに保存された変更はハードディスク上に残ります。
Kanzi Studio のコードエディタでコード補完の候補を表示するには、Ctrl Space を押します。
Kanzi Studio の Shader Source Editor でシェーダーを編集するときは、Uniforms ボタンと Attributes ボタンを使用すると、ユニフォームとアトリビュートを宣言するコードスニペットを現在のカーソル位置にすばやく追加できます。
ステータスバーには、コードが保存されたときなど、エディターのステータスに関するメッセージが表示されます。
シェーダーファイルを保存すると、Kanzi Studio が自動的にコンパイルします。コンパイルエラーが発生した場合、エラーは Log に表示されます。Preview では、無効なシェーダーを含むマテリアルを持つオブジェクトが赤で表示されます。
シェーダー属性¶
シェーダープログラムの入力は、頂点属性とユニフォームです。属性は頂点ごとに異なり、頂点シェーダーに提供されます。ユニフォームは、頂点シェーダーまたはフラグメントシェーダーの入力として使用できます。
メッシュのバーテックスバッファには、一連のアトリビュートも含まれています。これらのバーテックスバッファアトリビュートは、バーテックスシェーダーにデータを送るために使用されます。
Kanzi は属性をシェーダープログラムに自動的に渡すことができますが、これらの設定を手動で構成することもできます。
頂点属性は常にこれらのセマンティクスのいずれかを持ち、Kanzi はこれらの名前を自動的に認識します。
アトリビュート (Attribute) |
データタイプ (Data Type) |
ディスクリプション (Description) |
|---|---|---|
kzPosition |
vec3 |
位置 |
kzNormal |
vec3 |
ノーマル (Normal) |
kzTangent |
vec3 |
タンジェント |
kzWeight |
vec4 |
ウェイト (Weight) |
kzMatrixIndices |
vec4 |
マトリックスパレット |
kzTextureCoordinate0 |
vec2 |
テクスチャ座標 0 |
kzTextureCoordinate1 |
vec2 |
テクスチャ座標 1 |
kzTextureCoordinate2 |
vec2 |
テクスチャ座標2 |
kzTextureCoordinate3 |
vec2 |
テクスチャ座標3 |
kzColor0 |
vec4 |
カラー 0 |
kzColor1 |
vec4 |
カラー1 |
kzColor2 |
vec4 |
カラー2 |
kzColor3 |
vec4 |
カラー3 |
kzMorphTargetXPosition |
vec3 |
モーフターゲット位置 X、ここで X は 0...8 です。 |
kzMorphTargetXNormal |
vec3 |
モーフターゲット法線 X、ここで X は 0...8 です。 |
kzMorphTargetXTangent |
vec3 |
モーフターゲット接線 X、ここで X は 0...8 です。 |
カスタム属性を追加することもできます。
シェーダー属性と頂点属性の間に一対一の関係がある場合、属性は自動的に互いにマッピングされます。メッシュデータで異なる動作をするようにマッピングを手動で設定することができます。デフォルトのリストにないシェーダー属性名を使用している場合は、手動でマッピングを行う必要があります。
マテリアルタイプのシェーダー属性のセマンティクスを表示および編集するには、Library > Materials and Textures > Material Types でマテリアルタイプを右クリックし、Open Shader Attributes Editor を選択します。
シェーダーユニフォーム¶
シェーダーユニフォームは、これらのデータソースからデータを受け取ることができます:
Kanzi デフォルトのユニフォーム
マテリアルタイプで定義されたプロパティタイプ。
ユニフォームの名前が Kanzi のデフォルトユニフォームのいずれかと一致する場合、Kanzi Engine はその値を自動的にシェーダープログラムに送信します。デフォルトで使用できるユニフォームは次のとおりです。
ユニフォーム (Uniform) |
データタイプ (Data Type) |
ディスクリプション (Description) |
|---|---|---|
コンテンツテクスチャ (ContentTexture) |
sampler2D |
レンダリング時にレンダーノードによって提供されるテクスチャ、例えば Image ノードに表示される画像です。2Dノードにカスタムレンダリングを適用する と Image ノードにカスタムレンダリングを適用する を参照してください。 |
RenderOpacity |
フロート (Float) |
レンダリングされた2Dノードの不透明度。2Dノードにカスタムレンダリングを適用する および Image ノードにカスタムレンダリングを適用する を参照してください。 |
kzWorldMatrix |
mat4 |
ローカル空間からワールド空間へポイントまたは行列を変換する行列。 |
kzCameraMatrix |
mat4 |
ワールド空間からビュー(カメラ)空間にポイントまたは行列を変換する行列。 |
kzCameraWorldMatrix |
mat4 |
ローカル空間からビュー(カメラ)空間にポイントまたはマトリックスを変換するマトリックス。 これはプリマルチプライ処理されたマトリックス |
kzProjectionCameraWorldMatrix |
mat4 |
ローカル空間からスクリーン空間へポイントまたは行列を変換する行列。 これはプリマルチプライされたマトリックス |
kzPreviousProjectionCameraWorldMatrix |
mat4 |
前のフレームの projection * camera * world 行列。 このユニフォームを使用して、モーションブラーやテンポラルアンチエイリアシング (TAA) などのエフェクト用に、ピクセルごとのスクリーン空間の速度を計算します。速度は、バーテックスシェーダーで、現在と前回のクリップ空間の位置の差として計算されます。 vec4 pos = kzProjectionCameraWorldMatrix * vec4(position, 1.0);
vec4 prevPos = kzPreviousProjectionCameraWorldMatrix * vec4(position, 1.0);
velocity = ((pos.xy / pos.w) - (prevPos.xy / prevPos.w)) * 0.5;
|
マテリアルの速度バッファー出力を有効にするには、PBR マテリアルのプリプロセッサー定義で KANZI_SHADER_OUTPUT_VELOCITY を 1 に設定します。次に、KANZI_SHADER_OUTPUT_VELOCITY_INDEX の値を、使用するテクスチャ座標のセマンティックインデックスに設定します。または、Smart PBR マテリアルタイプを使用します。このマテリアルタイプは、Prism Graph が必要とする場合にプリプロセッサー定義を自動的に有効にします。
kzProjectionCameraMatrix
mat4
ワールド空間からスクリーン空間にポイントまたは行列を変換する行列。
これはプリマルチプライされた行列
kzProjectionMatrix * kzCameraMatrixです。
kzProjectionMatrix
mat4
ビュー(カメラ)空間からスクリーン空間にポイントまたは行列を変換する行列。
kzNormalMatrix
mat4
オブジェクトの法線をローカル空間からワールド空間に変換する行列。
kzCameraNormalMatrix
mat4
オブジェクトの法線をローカル空間からビュー(カメラ)空間に変換する行列。
これはプリマルチプライ処理された行列
kzCameraMatrix * kzNormalMatrixです。
kzCameraPosition
vec3
ワールド空間におけるカメラの位置。
kzViewPosition
vec4
ビュー方向を計算するための均質な位置:
positionWorld.xyz * kzViewPosition.w - kzViewPosition.xyz。
kzTime
フロート (Float)
デバッグタイマー。1.0f = 1000 ミリ秒。
kzTexture
sampler2D
ブラシまたはマテリアルに適用するテクスチャ。
kzTextureSize0
vec2
シェーダー内の 1 番目のテクスチャの
(width, height)形式のサイズ。
kzTextureSize1
vec2
シェーダー内の 2 番目のテクスチャの
(width, height)形式のサイズ。
kzTextureSize2
vec2
シェーダー内の 3 番目のテクスチャの
(width, height)形式のサイズ。
kzTextureSize3
vec2
シェーダー内の 4 番目のテクスチャの
(width, height)形式のサイズ。
kzMatrixPalette
vec4
頂点スキニングで Kanzi が使用する4x3行列の配列。それぞれの行列は次の形式です:
[ m00 m01 m02 translate_x]
[ m10 m11 m12 translate_y]
[ m20 m21 m22 translate_z]
kzCameraNearFarPlane
vec2
カメラからの近接および遠方の平面距離。
kzMorphWeights[8]
フロート (Float)
Kanzi がモーフィングで使用するメッシュウェイトの配列。
kzViewport
vec4
Kanzi が現在レンダリングしているビューポートを表す
(x, y, width, height)形式のベクトル:
xとyは、ビューポート矩形の左下隅をピクセル単位で定義します。
widthとheightはビューポートの幅と高さを定義します。デフォルトで、
kzViewportはアプリケーションの Screen ノードにマップされます。
xとyは 0 に等しい。
widthとheightは画面の幅と高さに等しいです。Kanzi がコンポジションターゲットまたはより大きなエリアのサブ矩形を伴う3Dシーンにレンダリングされるとき、
kzViewportはそのターゲットエリアを表します。
kzWindowSize
vec2
アプリケーションの Screen ノードのサイズ
(width, height)。
マテリアルユニフォーム (Material uniforms)¶
シェーダーのマテリアルタイプで定義されたプロパティタイプのいずれかとユニフォームの名前が一致する場合、値はプロパティを使用して提供されます。実行時には、プロパティの値がレンダリングされたマテリアルと、マテリアルタイプで定義されたライトプロパティに一致するライトから収集され、プロパティの上書きが可能です。
ユニフォームの名前とデータ型は、マテリアルタイプ内のプロパティタイプの名前とデータ型と一致している必要があります。プロパティタイプの表示名は、このコンテキストで使用される実際の名前と異なる場合があることに注意してください。プロパティタイプ (Property Types) を参照してください。例えば、マテリアルタイプに色のプロパティタイプDiffuseがある場合、シェーダーコードには次の定義が必要です。
uniform mediump vec4 Diffuse;
名前の文字と大文字小文字は一致している必要があります。これらはプロパティデータ型からシェーダーユニフォームデータ型への互換性のあるデータ型です。
プロパティデータタイプ |
シェーダーユニフォームデータタイプ |
|---|---|
フロート (Float) |
フロート (Float) |
ベクトル2D |
vec2 |
ベクトル3D |
vec3 |
カラー (Color) |
vec4 |
ベクター 4D (Vector 4D) |
vec4 |
マトリックス2D |
mat2 |
マトリックス3D |
mat3 |
マトリックス4D |
mat4 |
テクスチャ (Texture) |
|
ライトプロパティタイプのユニフォーム配列¶
ライトプロパティタイプは、ユニフォーム配列をサポートしています。これにより、同じタイプの複数のライトを使用することができます。例えば、1つのシェーダープログラムが2つのディレクショナルライトを使用する場合、そのマテリアルタイプのシェーダーに配列プロパティタイプを追加する必要があります。
uniform mediump vec4 DirectionalLightColor[2];
uniform mediump vec3 DirectionalLightDirection[2];
これらのプロパティタイプは、均一な配列をサポートします:
DirectionalLightColor
DirectionalLightDirection
PointLightColor
PointLightAttenuation
PointLightPosition
PointLightRadius
SpotLightColor
SpotLightPosition
スポットライトディレクション (SpotLightDirection)
スポットライト減衰 (SpotLightAttenuation)
SpotLightCutoffAngle
SpotLightConeParameters
SpotLightExponent
SpotLightRadius
OpenGL ES バージョンを設定する¶
シェーダーソースファイルで #version ディレクティブを使用して、シェーダーコードが使用する OpenGL ES シェーディング言語のバージョンを宣言します。
Kanzi では、組み込みターゲットには GLSL ES 3.1 以降、デスクトップターゲットにはデスクトップ GLSL 1.40 以降が必要です。#version 100 や #version 300 es などの以前のバージョンは受け付けられません。
例えば、シェーダーソースファイルで組み込みターゲットに必要な最小バージョンを使用するように設定するには、ファイルの先頭行に次の行を追加します。
#version 310 es
マテリアルタイプでは、そのマテリアルタイプのシェーダーソースファイルで宣言したバージョンをオーバーライドできます。
マテリアルタイプで OpenGL ES バージョンをオーバーライドするには、次の手順を実行します。
Library > Materials and Textures > Material Types で、OpenGL ES バージョンを設定するマテリアルタイプを選択します。
Properties で Input > Shader Version プロパティを追加し、マテリアルタイプで使用する OpenGL ES バージョンに設定します。
シェーダーコードの再利用¶
複数のシェーダーで使用したい機能を個別のシェーダーに配置することで、シェーダーコードを再利用できます。例えば、この方法で、複数のシェーダーで使用するヘルパー関数をシェーダーにインクルードできます。
シェーダーコードを再利用するには:
Library > Resource Files Alt を押しながら右クリック Shaders で、Shader Source File を選択し、シェーダーファイルに名前を付けます。
例えば、シェーダーファイルに名前を付ける際は、MyHelperShader としてください。
作成したシェーダーファイルをダブルクリックし、Shader Source Editor に、別のシェーダーファイルに含めたい機能を実装するコードを追加します。
例えば、RGBカラー値をグレースケールに変換する関数を追加します。
float colorToLuma(vec3 col) { return col.r * 0.2126 + col.g * 0.7152 + col.b * 0.0722; }
Library > Resource Files > Shaders で、別のシェーダーを含めたいシェーダーファイルをダブルクリックし、Shader Source Editor で
#includeディレクティブの後にシェーダーファイル名を追加します。Kanzi は、シェーダーの内容で
#includeディレクティブを追加する行を置き換えます。例えば、シェーダー
MyHelperShader.glslを含めるには:... #include "MyHelperShader.glsl" ...
ファイルをコピーせずにプロジェクト間でシェーダーコードを共有するには、Kanzi のシェーダーインクルードライブラリを使用します。シェーダーインクルードライブラリを使用する を参照してください。
APIでのシェーダーの使用¶
詳細については、ShaderProgram クラスを参照してください。