シェーダーを編集する¶
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 |
ローカル空間からスクリーン空間へポイントまたは行列を変換する行列。 これはプリマルチプライされたマトリックス |
kzProjectionCameraMatrix |
mat4 |
ワールド空間からスクリーン空間にポイントまたは行列を変換する行列。 これはプリマルチプライされた行列 |
kzProjectionMatrix |
mat4 |
ビュー(カメラ)空間からスクリーン空間にポイントまたは行列を変換する行列。 |
kzNormalMatrix |
mat4 |
オブジェクトの法線をローカル空間からワールド空間に変換する行列。 |
kzCameraNormalMatrix |
mat4 |
オブジェクトの法線をローカル空間からビュー(カメラ)空間に変換する行列。 これはプリマルチプライ処理された行列 |
kzCameraPosition |
vec3 |
ワールド空間におけるカメラの位置。 |
kzViewPosition |
vec4 |
ビュー方向を計算するための均質な位置: |
kzTime |
フロート (Float) |
デバッグタイマー、1.0f = 1000ミリ秒。 |
kzTexture |
sampler2D |
ブラシまたはマテリアルに適用するテクスチャ。 |
kzTextureSize0 |
vec2 |
シェーダー内の 1 番目のテクスチャの |
kzTextureSize1 |
vec2 |
シェーダー内の 2 番目のテクスチャの |
kzTextureSize2 |
vec2 |
シェーダー内の 3 番目のテクスチャの |
kzTextureSize3 |
vec2 |
シェーダー内の 4 番目のテクスチャの |
kzMatrixPalette |
vec4 |
頂点スキニングで Kanzi が使用する4x3行列の配列。それぞれの行列は次の形式です:
|
kzCameraNearFarPlane |
vec2 |
カメラからの近接および遠方の平面距離。 |
kzMorphWeights[8] |
フロート (Float) |
Kanzi がモーフィングで使用するメッシュウェイトの配列。 |
kzViewport |
vec4 |
Kanzi が現在レンダリングしているビューポートを表す
デフォルトで、
Kanzi がコンポジションターゲットまたはより大きなエリアのサブ矩形を伴う3Dシーンにレンダリングされるとき、 |
kzWindowSize |
vec2 |
アプリケーションの Screen ノードのサイズ |
マテリアルユニフォーム (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 シェーディング言語のバージョンを宣言してください。
例えば、シェーダーソースファイルをOpenGL ES 3.0を使用するように設定するには、ファイルの先頭に次のように追加します。
#version 300 es
バージョン100を宣言し、Kanzi がシェーダーソースファイル内のコードがOpenGL ES 3を必要とすることを検出した場合、Kanzi は自動的にバージョンを300に設定します。
マテリアルタイプの場合、そのマテリアルタイプのシェーダーソースファイルで宣言したバージョンをオーバーライドできます。
マテリアルタイプで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" ...
APIでのシェーダーの使用¶
詳細については、ShaderProgram クラスを参照してください。