マテリアルタイプとマテリアル

マテリアルタイプは、マテリアルのプロパティタイプを定義します。マテリアルタイプによって定義されたマテリアルプロパティ値を調整することで、マテリアルの外観を設定します。各マテリアルタイプには、頂点シェーダーとフラグメントシェーダーがあり、マテリアルで使用できるプロパティのタイプを設定します。

3D ノードおよび Material Brush ブラシの見た目を設定するには、マテリアルを使用します。

メッシュの使用 と ブラシの使用 を参照してください。

Library > Materials and Textures の Kanzi Studio では、利用可能なマテリアルタイプ、マテリアル、テクスチャ、ブラシ、シェーダーを確認したり、新しいものを追加したりできます。

../../_images/library-materials-and-textures.png

マテリアルプロパティに加えて、マテリアルタイプではライトで使用されるプロパティを設定できます。ライトプロパティは通常、配列で定義されます。ライトプロパティ配列のアイテム数は、マテリアルタイプが許可するライトの数を指定します。ライトは、現在レンダリングされているマテリアルタイプにライトプロパティのいずれかを持つアクティブなシーンのライトからランタイムで収集されます。シェーダープロパティは、シェーダーコードから解析されたシェーダーの入力を視覚化します。ライトノードを使用する を参照してください。

Kanzi Studio は、<KanziInstallation>/Studio/Asset Library にある Kanzi Studio Asset Library からのデフォルトのマテリアルタイプとシェーダーのセットを含むテンプレートプロジェクトを提供します。新しい Kanzi Studio プロジェクトを作成する際に、提供されるマテリアルタイプに基づいて異なるプロジェクトテンプレートを選択できます。

  • 事前定義されたマテリアルタイプを含まないテンプレートを開始するには、Import material types manually を選択します。必要に応じて、Kanzi Studio マテリアルライブラリからプロジェクトにマテリアルタイプを追加するか、自分自身でマテリアルタイプを作成することができます。プロジェクトへのマテリアルタイプの追加 を参照してください。

  • High performance vertex shaders テンプレートは、低精度で高パフォーマンスの OpenGL ES2 アプリケーション向けに設計されています。これは、OpenGL ES2 での使用に最適化された頂点ベースのシェーダーを含んでいます。Phong 反射モデルを使用したライティングの適用を含む、GPU 固有の計算のほとんどは頂点シェーダーで行われます。これは、ほとんどのデバイスにとって良い出発点です。

  • High quality fragment shaders テンプレートは、高精度の OpenGL ES2 アプリケーション向けに設計されています。これは、OpenGL ES2 で使用するためのピクセルシェーダーベースのマテリアルを含んでいます。Phong 反射モデルを使用したライティングの適用を含む、GPU 固有の計算のほとんどはフラグメントシェーダーで行われます。これにより、しばしばパフォーマンスを犠牲にして、より良い画像品質が提供されます。

  • Physically based rendering テンプレートは、OpenGL ES3 アプリケーション向けに設計されています。これは、物理ベースレンダリング (PBR) の原則を実装したシェーダーに基づくマテリアルを含んでいます。これらのマテリアルのプロパティは、メタルネスのような物理的特性を表しており、直感的に制御できます。物理ベースのライティングモデルを使用したライトの適用を含む、GPU 固有の計算のほとんどはフラグメントシェーダーで行われます。これにより、多くのライティング条件でより現実的なレンダリング結果が得られます。

High performance vertex shaders、High quality fragment shaders、および Physically based rendering プロジェクトテンプレートは、プロジェクトのマテリアルライブラリで利用可能な一連のマテリアルタイプを定義しており、それぞれにフラグメントシェーダーとバーテックスシェーダーがあります。シェーダー を参照してください。

どの素材セットを選ぶべきか分からない場合は、Import material types manually を選択し、必要に応じて素材を追加してください。

使用されるシェーディングのタイプが、パフォーマンス劣化を引き起こす最初のボトルネックである場合がよくあります。シェーダーのベストプラクティス を参照してください。

マテリアルタイプバインディング

マテリアルタイプのバインディングにより、次のことが可能になります。

  • シェーダーコードを編集せずにシェーダーユニフォームの値を変更します。ユニフォームバインディング を参照してください。

  • バインディングの結果を一時変数に格納し、他のバインディングで参照できるようにします。一時変数バインディング を参照してください。

ユニフォームバインディング

マテリアルタイプでは、頂点シェーダーとフラグメントシェーダーが、そのマテリアルで使用できるユニフォームとプロパティタイプを定義します。特定のマテリアルタイプで3Dノードをレンダリングする際、ユニフォームバインディングにより、Kanzi がレンダーステートに値を書き込み、それらの値をユニフォームとプロパティタイプに使用することができます。

マテリアルタイプの使用、シェーダーユニフォーム、レンダリング を参照してください。

ユニフォームバインディングを使用すると、シェーダーコードを変更せずに、マテリアルタイプで使用されるシェーダーユニフォームの値を変更できます。

例えば、特定のタイプの Light ノードのレンダー値を設定するために、ライトプロパティタイプのユニフォームバインディングを使用できます。Kanzi はそのレンダー値を使用して、バインディングを持つマテリアルタイプを使用するすべての3Dノードをシーンでレンダリングします。ライトユニフォームの制御 を参照してください。

../../_images/textured-default-uniform-bindings.png

各マテリアルタイプにおいて、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 はそのコレクションから異なる値を使用して各ノードをレンダリングします。

マテリアルタイプバインディングにおける一時変数 を参照してください。

../../_images/temporary-variable-bindings.png

関連項目

マテリアルを使用する (Using materials)

マテリアルタイプの使用

テクスチャ付きマテリアルの作成

透明なマテリアルの作成

ブラシの使用

シェーダー

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

レンダリング

バインディング (Bindings)

バインディング式リファレンス

プロパティタイプを作成する

ファクトリーコンテンツ (Factory Content) のアセット