ライトノードを使用する

Kanzi アプリケーションの Scene 内にライトを作成するには、ライト (Light) ノードを使用します。

Kanzi には、次のライトノードタイプがあります。

Directional Light は一方向にのみ光を放ち、太陽光のモデリングに適しています。

../../_images/directional-light.png

Point Light は特定の場所からすべての方向 (360 度) に均一に光を放射します。

../../_images/point-light.png

Spot Light は、特定の位置から特定の方向に、円錐形状の光を放射します。

../../_images/spot-light.png

ライトには、Kanzi が 3D ノードをレンダリングする際にユニフォームとしてシェーダーに渡されるプロパティが含まれています。ライトは、そのライトを使用するシェーダーを持つマテリアルを使用しているノードのレンダリングにのみ影響します。

Kanzi では、VertexPhong、FragmentPhong、および PhysicallyBased マテリアルはデフォルトで以下をサポートしています。

  • 1 つのディレクショナルライト

  • 2 つのポイントライト

  • 1 つのスポットライト

スマートマテリアルのライト数の設定 と マテリアルタイプのライト数の設定 を参照してください。

ライトノードのプロパティタイプを制御するために、ユニフォームバインディングを使用できます。ライトユニフォームの制御 を参照してください。

ライトノードを作成する

ライトノードを作成するには、以下のようにします。

  1. Node Tree で、ライトノードを作成したいノード Alt を押しながら右クリック を選択し、Directional Light、Point Light、または Spot Light を選択します。

    たとえば、Spot Light を作成します。

    Scene ノードのような3Dノードでのみ、ライトノードを作成できます。

    ../../_images/create-spot-light.png
  2. Preview では、光ノードを配置するために Node tool image0 を使用します。

    ../../_images/select-node-tool.png
  3. Properties で、ライトノードのプロパティを調整して、ニーズに合ったライトを作成します。

    例えば、Spot Light の色を調整するには、Spot Light Color プロパティの値を設定します。

    ../../_images/spot-light-color.png

ライトの明るさを調整する

ライトの明るさを調整するには、ライトの色の強度を設定します。

例えば、Point Light の明るさを設定するには、Point Light Color プロパティの Intensity (I) プロパティフィールドの値を設定します。

../../_images/set-light-intensity.png ../../_images/sphere-and-point-light.png

Kanzi の光の強度は、写真撮影における露出と同様に機能します。

  • 強度を1単位増加させると、光の量が2倍になります。

  • 強度を1単位減少させると、光の量が半分になります。

たとえば、強度を変更すると:

  • 0から+2まで、明るさを4倍にします。

  • 0から-3まで、明るさを1/8に減少させます。

../../_images/intensity-4.png ../../_images/intensity-3.png ../../_images/intensity-2.png ../../_images/intensity-1.png ../../_images/intensity1.png ../../_images/intensity2.png ../../_images/intensity3.png ../../_images/intensity4.png

ライトを消すこと

ライトを消すには、ライトノードを選択し、Properties で Node > Visible プロパティを追加して無効にします。

../../_images/node-visible-disabled.png

スマートマテリアルのライト数の設定

SmartPhysicallyBased、SmartVertexPhong、または SmartFragmentPhong マテリアルタイプを使用するマテリアルでは、そのマテリアルが使用できるライトのタイプと数を設定できます。スマートマテリアルを使用する を参照してください。

スマートマテリアルのライト数を設定するには:

  1. Library > Materials and Textures > Materials で、SmartPhysicallyBased、SmartVertexPhong、または SmartFragmentPhong マテリアルタイプを使用するマテリアルを選択します。

    例えば、SmartPhysicallyBasedMaterial を選択します。プロジェクトにこのマテリアルが含まれていない場合は、Library > Materials and Textures Alt を押しながら右クリック Material Types で、SmartPhysicallyBased を選択します。

    ../../_images/library-smart-physically-based-material.png
  2. Properties で、以下の Material Properties のいずれかを追加して設定します。

    • Limit Directional Lights でディレクショナルライトの数を設定

      デフォルトでは、マテリアルは 1 つのディレクショナルライトをサポートします。

    • ポイントライトの数を設定する Limit Point Lights

      デフォルトでは、マテリアルは 2 つのポイントライトをサポートします。

    • スポットライトの数を設定する Limit Spot Lights

      デフォルトでは、マテリアルは 1 つのスポットライトをサポートします。

    例えば、シーン内の最初の 3 つの Point Light ノードをレンダリングするようにマテリアルを設定するには、Limit Point Lights プロパティを追加して 3 に設定します。

    シーンに 4 つ以上のポイントライトが含まれている場合、このマテリアルを使用するノードのレンダリングに影響するのは、そのうち最初の 3 つのみです。

    ../../_images/properties-limit-point-lights.png

マテリアルタイプのライト数の設定

マテリアルタイプでは、そのマテリアルタイプに基づくマテリアルが使用できるライトのタイプと数を設定できます。

マテリアルタイプのライト数を設定するには:

  1. Library > Materials and Textures > Material Types で、ライトを設定したいマテリアルタイプを選択します。

    例えば、VertexPhong マテリアルタイプを選択します。

    この方法は、Kanzi のデフォルトの VertexPhong、FragmentPhong、および PhysicallyBased マテリアルタイプにのみ使用できます。その他のマテリアルタイプのライト数を変更するには、マテリアルのシェーダーを手動で編集する必要があります。シェーダーを編集する を参照してください。

    ../../_images/vertexphong-in-library.png
  2. Properties の Preprocessor Definitions で、ライトタイプごとに Value を使用したいライトの数に設定します。

    • ディレクショナルライトの数を設定する KANZI_SHADER_NUM_DIRECTIONAL_LIGHTS

    • ポイントライトの数を設定する KANZI_SHADER_NUM_POINT_LIGHTS

    • スポットライトの数を設定する KANZI_SHADER_NUM_SPOT_LIGHTS

    例えば、マテリアルが 4 つのスポットライトを使用するように設定するには、KANZI_SHADER_NUM_SPOT_LIGHTS の Value を 4 に設定して Enter キーを押します。これで、このマテリアルタイプを使用するすべてのマテリアルが 4 つのスポットライトをレンダリングできるようになります。シーンに 5 つ以上のスポットライトが含まれている場合、そのマテリアルタイプのマテリアルを使用するノードのレンダリングに影響するのは、そのシーン内の最初の 4 つのライトのみです。

    Enter キーを押すと、Kanzi Studio は Uniforms で、変更したライトタイプのプロパティのユニフォーム配列を更新します。

    ../../_images/phong-preprocessor-defines.png ../../_images/phong-shader-uniforms-with-4-spot-lights.png

ライトユニフォームの制御

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

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

ライトプロパティタイプは一様配列をサポートしており、同じタイプの複数のライトを使用することができます。ライトプロパティタイプのユニフォーム配列 を参照してください。

ライトプロパティタイプのユニフォームバインディングは、そのプロパティタイプを使用するライトから抽出された値に基づいて、レンダーステートのユニフォーム値を設定します。例えば、PointLightColor プロパティタイプのユニフォームバインディングは、そのバインディングを持つマテリアルタイプを使用する3Dノードを照らすシーン内のすべての Point Light ノードにおける Point Light Color プロパティの個々の値に基づいてレンダー値を設定します。

バインディングを使用してライトユニフォームを制御するには:

  1. Node Tree で3Dコンテンツを作成し、そのコンテンツを照らすために使用する Light ノードを作成します。

    例えば、ここでは異なる色の3つの Point Light ノードが灰色の Sphere ノードを照らしています。使用する3Dコンテンツのマテリアルタイプが、使用したいライトの数をサポートしていることを確認してください。マテリアルタイプのライト数の設定 を参照してください。

    ../../_images/sphere-and-rgb-lights.png ../../_images/point-lights-in-preview-default.png
  2. Library > Materials and Textures > Material Types で、3Dコンテンツが使用するマテリアルタイプを選択します。

    例えば、VertexPhong マテリアルタイプを選択します。

    ../../_images/vertexphong-in-library.png
  3. Properties の中で、Bindings > Uniforms において、変更したいユニフォームのレンダー値を設定するバインディングをクリックします。

    例えば、PointLightColor ユニフォームの値を設定するバインディングをクリックします。このバインディングは、VertexPhong マテリアルタイプを使用する3Dノードを照らすシーン内のすべての Point Light ノードにおける Point Light Color プロパティの個々の値に基づいて、ユニフォームのレンダー値を設定します。

    ../../_images/vertexphong-click-pointlightcolor-binding.png
  4. Binding Editor で使用したいバインディング式を入力し、Save をクリックします。

    ライトプロパティタイプのユニフォームバインディングは、そのプロパティタイプを使用するライトから抽出された値に基づいて、レンダーステートのユニフォーム値を設定します。例えば、PointLightColor プロパティタイプのユニフォームバインディングは、そのバインディングを持つマテリアルタイプを使用する3Dノードを照らすシーン内のすべての Point Light ノードにおける Point Light Color プロパティの個々の値に基づいてレンダー値を設定します。

    バインディング式でこの構文を使用できます:

    • Draw Objects レンダーパスまたは Draw Objects With Material レンダーパスがシーン内の 3D ノードを描画するために使用する、特定のタイプの各ライトノードを含むレンジを取得するには、{##RenderPass/DrawObjectsRenderPass.[lightType]} を使用します。

      Kanzi には、次のライトタイプがあります: DirectionalLights、PointLights、および SpotLights。

      レンダリングでのライトの使用 を参照してください。

    • 特定のタイプの各ライトノードにおけるプロパティの値を含む範囲を取得するには、バインディング式で中括弧内に ##RenderPass/DrawObjectsRenderPass.[lightType] を入力し、その後に省略記号とライトノード内のプロパティ名を続けてください。

    • ライトの範囲にわたるビューを作成するには、createViewを作成する 関数を使用します。

    • ライトの範囲に対して累積操作を行うには、... 演算子の後に算術演算子を使用します。

    • 同じマテリアルタイプで一時変数バインディングの結果を参照するには、{##Self/[temporaryVariableProperty]} 構文を使用します。ここで、temporaryVariableProperty は一時変数バインディングのターゲットプロパティです。一時変数バインディング を参照してください。

    ライトユニフォームバインディング を参照してください。

    例:

    • 各 Point Light ノードの Point Light Color プロパティにおける赤と緑の色チャンネルの値を半分にするには、デフォルトのバインディングの結果に Color4(0.5, 0.5, 1, 1) を掛けます。

      pointLightsView = createView<OutputSize>({##RenderPass/DrawObjectsRenderPass.PointLights})
      {pointLightsView ... PointLightColor} * Color4(0.5, 0.5, 1, 1)
      
      ../../_images/vertexphong-pointlightcolor-binding.png ../../_images/point-lights-in-preview-binding.png
    • Point Light ノードのいずれかの Opacity プロパティの値に基づいて、すべての Point Light ノードを暗くするには:

      # Get the range that contains the value of the Point Light Color property in each
      # Point Light node.
      rangeA = {##RenderPass/DrawObjectsRenderPass.PointLights ... PointLightColor}
      # Get the range that contains the value of the Opacity property in each
      # Point Light node.
      rangeB = {##RenderPass/DrawObjectsRenderPass.PointLights ... Node.Opacity}
      # Multiply the value of the Opacity property in each Point Light node.
      totalOpacity = ...* rangeB
      # For each Point Light node multiply the value of the Point Light Color property
      # by the multiplied opacity.
      rangeA * totalOpacity
      
      ../../_images/vertexphong-pointlightcolor-binding2.png ../../_images/dim-lights.png

APIでのライトノードの使用

Directional Light を作成して設定するには、

// Create a directional light named Directional light.
LightSharedPtr directionalLight = Light::createDirectional(domain, "Directional light");
// Rotate the directional light node by -45 degrees around the x axis.
SRTValue3D layoutTransformation = directionalLight->getLayoutTransformation();
layoutTransformation.setRotation(Vector3(degreesToRadians(-45.0f), 0.0f, 0.0f));
directionalLight->setLayoutTransformation(layoutTransformation);
// Set the color of the directional light to red.
directionalLight->setDirectionalLightColor(ThemeRed);

Point Light を作成して設定するには:

// Create a spot light named Spot light.
LightSharedPtr spotLight = Light::createSpot(domain, "Spot light");
// Move the spot light on x axis by 4 units and rotate it around the y axis by 90 degrees.
SRTValue3D layoutTransformation = spotLight->getLayoutTransformation();
layoutTransformation.setTranslation(Vector3(4.0f, 0.0f, 0.0f));
layoutTransformation.setRotation(Vector3(0.0f, degreesToRadians(90.0f), 0.0f));
spotLight->setLayoutTransformation(layoutTransformation);
// Set the color of the spot light to blue.
spotLight->setSpotLightColor(ThemeBlue);
// Set the angle of the spot light cone to 45 degrees.
spotLight->setSpotLightCutoffAngle(45.0f);
// Set how concentrated the spot light is.
spotLight->setSpotLightExponent(30.0f);
// Set the constant attenuation for the spot light to 1.3, and linear and quadratic attenuation to 0.
spotLight->setSpotLightAttenuation(Vector3(1.3f, 0.0f, 0.0f));

Spot Light を作成して設定するには:

// Create a point light named Point light.
LightSharedPtr pointLight = Light::createPoint(domain, "Point light");
// Move the point light on y axis by 4 units.
SRTValue3D layoutTransformation = pointLight->getLayoutTransformation();
layoutTransformation.setTranslation(Vector3(0.0f, 4.0f, 0.0f));
pointLight->setLayoutTransformation(layoutTransformation);
// Set the color of the point light to green.
pointLight->setPointLightColor(ThemeGreen);
// Set the constant attenuation for the point light to 0.8, and linear and quadratic attenuation to 0.
pointLight->setPointLightAttenuation(Vector3(0.8f, 0.0f, 0.0f));

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

ライトノードプロパティタイプ

ライトノードで利用可能なプロパティタイプのリストについては、以下を参照してください:

関連項目

シェーダー

シェーダーを編集する

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

マテリアルタイプの使用

レンダリング

レンダリングでのライトの使用

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