マテリアルタイプとマテリアル¶
マテリアルタイプは、マテリアルのプロパティタイプを定義します。マテリアルタイプによって定義されたマテリアルプロパティ値を調整することで、マテリアルの外観を設定します。各マテリアルタイプには、頂点シェーダーとフラグメントシェーダーがあり、マテリアルで使用できるプロパティのタイプを設定します。
3D ノードおよび Material Brush ブラシの見た目を設定するには、マテリアルを使用します。
Library > Materials and Textures の Kanzi Studio では、利用可能なマテリアルタイプ、マテリアル、テクスチャ、ブラシ、シェーダーを確認したり、新しいものを追加したりできます。
マテリアルプロパティに加えて、マテリアルタイプではライトで使用されるプロパティを設定できます。ライトプロパティは通常、配列で定義されます。ライトプロパティ配列のアイテム数は、マテリアルタイプが許可するライトの数を指定します。ライトは、現在レンダリングされているマテリアルタイプにライトプロパティのいずれかを持つアクティブなシーンのライトからランタイムで収集されます。シェーダープロパティは、シェーダーコードから解析されたシェーダーの入力を視覚化します。ライトノードを使用する を参照してください。
Kanzi Studio は、<KanziInstallation>/Studio/Asset Library にある Kanzi Studio Asset Library からのデフォルトのマテリアルタイプとシェーダーのセットを含むテンプレートプロジェクトを提供します。新しい Kanzi Studio プロジェクトを作成する際に、提供されるマテリアルタイプに基づいて異なるプロジェクトテンプレートを選択できます。
事前定義されたマテリアルタイプを含まないテンプレートを開始するには、Import material types manually を選択します。必要に応じて、Kanzi Studio マテリアルライブラリからプロジェクトにマテリアルタイプを追加するか、自分自身でマテリアルタイプを作成することができます。プロジェクトにマテリアルタイプを追加する を参照してください。
High performance vertex shaders テンプレートは、低精度で高パフォーマンスのアプリケーション向けです。このテンプレートには頂点ベースのシェーダーが含まれています。Phong 反射モデルを使用したライトの適用を含め、GPU 固有の計算のほとんどはバーテックスシェーダーで行われます。ほとんどのデバイスにとって、これは良い出発点となります。
High quality fragment shaders テンプレートは、高精度のアプリケーション向けです。このテンプレートにはピクセルシェーダーベースのマテリアルが含まれています。Phong 反射モデルを使用したライトの適用を含め、GPU 固有の計算のほとんどはフラグメントシェーダーで行われます。これにより、多くの場合パフォーマンスと引き換えに、より高い画質が得られます。
Physically based rendering テンプレートは、最新のアプリケーション向けです。このテンプレートには、物理ベースレンダリング (PBR) の原則を実装したシェーダーに基づくマテリアルが含まれています。これらのマテリアルのプロパティはメタルネスなどの物理的特性を表すため、直感的に操作できます。物理ベースのライティングモデルを使用したライトの適用を含め、GPU 固有の計算のほとんどはフラグメントシェーダーで行われます。これにより、多くのライティング条件でよりリアルなレンダリング結果が得られます。
High performance vertex shaders、High quality fragment shaders、および Physically based rendering プロジェクトテンプレートは、プロジェクトのマテリアルライブラリで利用可能な一連のマテリアルタイプを定義しており、それぞれにフラグメントシェーダーとバーテックスシェーダーがあります。シェーダー を参照してください。
どの素材セットを選ぶべきか分からない場合は、Import material types manually を選択し、必要に応じて素材を追加してください。
使用されるシェーディングのタイプが、パフォーマンス劣化を引き起こす最初のボトルネックである場合がよくあります。シェーダーのベストプラクティス を参照してください。
マテリアルタイプバインディング¶
マテリアルタイプのバインディングにより、次のことが可能になります。
シェーダーコードを編集せずにシェーダーユニフォームの値を変更します。ユニフォームバインディング を参照してください。
バインディングの結果を一時変数に格納し、他のバインディングで参照できるようにします。一時変数バインディング を参照してください。
ユニフォームバインディング¶
マテリアルタイプでは、頂点シェーダーとフラグメントシェーダーが、そのマテリアルで使用できるユニフォームとプロパティタイプを定義します。特定のマテリアルタイプで3Dノードをレンダリングする際、ユニフォームバインディングにより、Kanzi がレンダーステートに値を書き込み、それらの値をユニフォームとプロパティタイプに使用することができます。
マテリアルタイプの使用、シェーダーユニフォーム、レンダリング を参照してください。
ユニフォームバインディングを使用すると、シェーダーコードを変更せずに、マテリアルタイプで使用されるシェーダーユニフォームの値を変更できます。
例えば、特定のタイプの Light ノードのレンダー値を設定するために、ライトプロパティタイプのユニフォームバインディングを使用できます。Kanzi はそのレンダー値を使用して、バインディングを持つマテリアルタイプを使用するすべての3Dノードをシーンでレンダリングします。ライトユニフォームの制御 を参照してください。
各マテリアルタイプにおいて、Kanzi Studio はそのマテリアルタイプのユニフォームに対してデフォルトのバインディングを自動的に作成します。これらのバインディングは、次のいずれかから値を取得します。
ユニフォームバインディング関数。
メモリ消費を削減し、パフォーマンスを向上させるために、Kanzi は最も一般的なシェーダーユニフォームに対するバインディング関数を提供します。Kanzi は、これらの関数を使用するすべてのバインディングを毎フレーム実行します。
ユニフォームバインディング関数 を参照してください。
例:
kzProjectionCameraWorldMatrix = getProjectionCameraWorldMatrix()
ノードまたはレンダーパスから読み取られるプロパティ値。
ほとんどのユニフォームバインディングは、レンダリングされる3Dノードのプロパティからデフォルト値を取得します。プロパティのバインディング を参照してください。
例:
BlendIntensity = {./BlendIntensity}
kzProjectionMatrix、kzCameraMatrix、kzViewportなどの一般的なレンダリングプロパティのバインディングは、レンダーパスのプロパティからデフォルトで値を取得します。マテリアルタイプバインディングにおけるレンダーパスプロパティ を参照してください。例えば、ビューポートの位置とサイズを設定する
kzViewportは、デフォルトで3Dノードを描画するレンダーパスの Rendering Viewport プロパティにバインドされています。kzViewport = {##RenderPass/DrawObjectsRenderPass.Viewport}
マテリアルタイプにプロパティを追加すると、Kanzi Studio はそのプロパティタイプのデフォルトのユニフォームバインディングを作成します。マテリアルタイプにプロパティを追加する を参照してください。
一時変数バインディング¶
マテリアルタイプでは、一時変数バインディングを使用して、バインディングの結果を一時変数に格納することができます。この変数は、同じマテリアルタイプ内の他のバインディングで参照することができます。
Kanzi は、一時変数を識別するためにプロパティタイプを使用します。これにより、次のことが可能になります。
一時変数を参照する際に、そのデータ型を別途指定する必要はありません。プロパティタイプは、そのデータ型に関する情報を保持します。
一時変数間の競合を検出します。
プロパティタイプを作成する を参照してください。
Kanzi は、そのマテリアルタイプを使用するノードがノードツリーに接続されるたびに、マテリアルタイプ内の一時変数バインディングを実行します。例えば、一時変数バインディングが 評価する バインディング関数を使用して、範囲プロパティに格納された値のコレクションをステップスルーする場合、Kanzi はそのコレクションから異なる値を使用して各ノードをレンダリングします。
マテリアルタイプバインディングにおける一時変数 を参照してください。