シェーダーを編集する

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 を押します。

    ../../_images/code-editor-code-completion.gif
  • Kanzi Studio の Shader Source Editor でシェーダーを編集するときは、Uniforms ボタンと Attributes ボタンを使用すると、ユニフォームとアトリビュートを宣言するコードスニペットを現在のカーソル位置にすばやく追加できます。

    ../../_images/use-uniforms-in-shader-source-editor.png ../../_images/use-attributes-in-shader-source-editor.png
  • ステータスバーには、コードが保存されたときなど、エディターのステータスに関するメッセージが表示されます。

  • シェーダーファイルを保存すると、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 を選択します。

../../_images/open-shader-attributes-editor.png ../../_images/shader-attributes-editor.png

シェーダーユニフォーム

シェーダーユニフォームは、これらのデータソースからデータを受け取ることができます:

  • Kanzi デフォルトのユニフォーム

  • マテリアルタイプで定義されたプロパティタイプ。

ユニフォームの名前が Kanzi のデフォルトユニフォームのいずれかと一致する場合、Kanzi Engine はその値を自動的にシェーダープログラムに送信します。デフォルトで使用できるユニフォームは次のとおりです。

ユニフォーム (Uniform)

データタイプ (Data Type)

ディスクリプション (Description)

コンテンツテクスチャ (ContentTexture)

sampler2D

レンダリング時にレンダーノードによって提供されるテクスチャ、例えば Image ノードに表示される画像です。2Dノードにカスタムレンダリングを適用する と Image ノードにカスタムレンダリングを適用する を参照してください。

RenderOpacity

フロート (Float)

レンダリングされた2Dノードの不透明度。2Dノードにカスタムレンダリングを適用する および Image ノードにカスタムレンダリングを適用する を参照してください。

kzWorldMatrix

mat4

ローカル空間からワールド空間へポイントまたは行列を変換する行列。

kzCameraMatrix

mat4

ワールド空間からビュー(カメラ)空間にポイントまたは行列を変換する行列。

kzCameraWorldMatrix

mat4

ローカル空間からビュー(カメラ)空間にポイントまたはマトリックスを変換するマトリックス。

これはプリマルチプライ処理されたマトリックス kzCameraMatrix * kzWorldMatrix です。

kzProjectionCameraWorldMatrix

mat4

ローカル空間からスクリーン空間へポイントまたは行列を変換する行列。

これはプリマルチプライされたマトリックス kzProjectionMatrix * kzCameraMatrix * kzWorldMatrix です。

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)

  • sampler1D

  • sampler2D

  • sampler3D

  • sampler1DShadow

  • sampler2DShadow

  • samplerCube

  • samplerCubeShadow

ライトプロパティタイプのユニフォーム配列

ライトプロパティタイプは、ユニフォーム配列をサポートしています。これにより、同じタイプの複数のライトを使用することができます。例えば、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 バージョンをオーバーライドするには、次の手順を実行します。

  1. Library > Materials and Textures > Material Types で、OpenGL ES バージョンを設定するマテリアルタイプを選択します。

    ../../_images/library-physically-based-material-type.png
  2. Properties で Input > Shader Version プロパティを追加し、マテリアルタイプで使用する OpenGL ES バージョンに設定します。

    ../../_images/properties-shader-version.png

シェーダーコードの再利用

複数のシェーダーで使用したい機能を個別のシェーダーに配置することで、シェーダーコードを再利用できます。例えば、この方法で、複数のシェーダーで使用するヘルパー関数をシェーダーにインクルードできます。

シェーダーコードを再利用するには:

  1. Library > Resource Files Alt を押しながら右クリック Shaders で、Shader Source File を選択し、シェーダーファイルに名前を付けます。

    例えば、シェーダーファイルに名前を付ける際は、MyHelperShader としてください。

    ../../_images/create-shader-source-file.png ../../_images/myhelpershader-in-library.png
  2. 作成したシェーダーファイルをダブルクリックし、Shader Source Editor に、別のシェーダーファイルに含めたい機能を実装するコードを追加します。

    例えば、RGBカラー値をグレースケールに変換する関数を追加します。

    float colorToLuma(vec3 col)
    {
        return col.r * 0.2126 + col.g * 0.7152 + col.b * 0.0722;
    }
    
  3. Library > Resource Files > Shaders で、別のシェーダーを含めたいシェーダーファイルをダブルクリックし、Shader Source Editor で #include ディレクティブの後にシェーダーファイル名を追加します。

    Kanzi は、シェーダーの内容で #include ディレクティブを追加する行を置き換えます。

    例えば、シェーダー MyHelperShader.glsl を含めるには:

    ...
    
    #include "MyHelperShader.glsl"
    
    ...
    

ファイルをコピーせずにプロジェクト間でシェーダーコードを共有するには、Kanzi のシェーダーインクルードライブラリを使用します。シェーダーインクルードライブラリを使用する を参照してください。

APIでのシェーダーの使用

詳細については、ShaderProgram クラスを参照してください。

関連項目

プロパティタイプ (Property Types)

シェーダーインクルードライブラリを使用する

シェーダーのベストプラクティス

メッシュの最適化