シェーダーを編集する

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 です。

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 シェーディング言語のバージョンを宣言してください。

例えば、シェーダーソースファイルをOpenGL ES 3.0を使用するように設定するには、ファイルの先頭に次のように追加します。

#version 300 es

バージョン100を宣言し、Kanzi がシェーダーソースファイル内のコードがOpenGL ES 3を必要とすることを検出した場合、Kanzi は自動的にバージョンを300に設定します。

マテリアルタイプの場合、そのマテリアルタイプのシェーダーソースファイルで宣言したバージョンをオーバーライドできます。

マテリアルタイプで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"
    
    ...
    

APIでのシェーダーの使用

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

関連項目

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

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

メッシュの最適化