[ブログに戻る](/ja/blog) # 環境ビューの背景と反射効果を使用する

Andrew Markovich 10月 20, 2022 [\#Visualize](/ja/blog/tag/visualize) [\#getting started](/ja/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

グラフィックシーンオブジェクトの反射は、特に建築モデルや機械モデルにおいて、レンダリング品質とリアリズムを大幅に向上させることができます。鏡、光沢のある表面や金属表面、水、ガラスなど、これらの素材は周囲の領域を正確に反射する場合にのみ物理的に正しく見えます。

マテリアルの反射を適用することは、通常、モデル編集時には必要ありませんが、実行時にモデルを表示する際にはレンダリング品質を大幅に向上させることができます (最終的なシーンレンダリング用には設計されていません)。

グラフィックスシーン内のマテリアルに反射効果を作成するには、環境マップ反射または反射プレーンを使用します。どちらのテクニックもWinGL ES2またはWinMetalベクトル化モジュールを必要とします。環境マップ反射はリアルですが、レンダリングパフォーマンスに影響を与えません。ただし、物理的に正確ではありません。反射プレーンは物理的に正確な反射を作成しますが、通常レイトレーシング技術を呼び出すため、CPU/GPUにとって高価な操作であり、リアルタイムレンダリングには困難です。

#### 環境マップ反射について

環境マップを使用して、環境背景と環境反射の両方に使用されるテクスチャを設定します。環境背景の詳細については、「ビュー背景の操作」を参照してください。環境反射は、レンダリングパフォーマンスを損なうことなく、グラフィックシーン内の多くのオブジェクトやマテリアルに適用でき、これらの「スカイボックス」反射は、シンプルなグラフィックモデルや目立たないグラフィックオブジェクトに対してリアルなシーンを作成します。ただし、環境マップ反射は物理的に正しい反射のエミュレーションであり、背景の反射のみを提供し、グラフィックシーン内のオブジェクトの反射は含まれません。

![cube map](/files/inline-images/ex_cubemap_background.png)*キューブマップの背景*

![cube map reflection](/files/inline-images/ex_cubemap_reflection.png)*キューブマップの反射*

#### 反射平面について

反射平面は、シーン内のすべての可視オブジェクトを含む、グラフィックシーンの完全な反射効果を作成できます。しかし、各ミラー平面の作成には既存のグラフィックシーンのレンダリングが必要なため、この効果はレンダリングパフォーマンスに顕著な影響を与えます。広範なグラフィックシーンに対して多数の反射平面を作成することは推奨されません。これはレンダリングを劇的に遅くする可能性があるためです（反射平面ミラーはフレーム変更ごとに再計算されるため、リアルタイムレンダリングパフォーマンスに常に影響を与えます）。

![reflection plane](/files/inline-images/ex_reflection_plane.png)#### 環境マップを使用したマテリアル反射の有効化

環境マップテクスチャを追加するには、OdDbRenderEnvironmentオブジェクトを使用します。

```
OdDbRenderEnvironmentPtr pEnv = ::oddbGetRenderEnvironmentObject(m_pDb, OdDb::kForWrite, true);
pEnv->setEnvironmentImageEnabled(true);
pEnv->setEnvironmentImageFileName(envImageFileName);
```

画像ファイル名は、保存時に.dwg/.dxfファイルに保存されるため、次回ファイルを開いたときにアクセスできます。この画像は、環境背景（利用可能な場合）および環境反射（マテリアルによって反射が上書きされない場合）に使用されます。

##### 環境反射のマテリアルを設定する

マテリアル反射を有効にするには、「反射率」マテリアルプロパティを使用します。

```
OdDbMaterialPtr pMaterial = ...;
pMaterial->setReflectivity(0.5);
```

反射率係数は0〜1の範囲で測定され、反射と拡散マテリアルカラーの混合割合を指定します。

- 0.0 — マテリアル反射なし（デフォルト）。
- 0.5 — 半分の反射と半分の拡散マテリアルカラー（光沢のある表面）。
- 1.0 — マテリアルカラーを混合しない完全な反射（金属表面）。

![reflectivity](/files/inline-images/ex_reflectivity.png)デフォルトでは、マテリアルは反射効果に環境テクスチャを使用しますが（設定されている場合）、マテリアルごとに反射マップを上書きすることも可能です。

```
OdGiMaterialMap reflectionMap;
reflectionMap.setSourceFileName(reflectionTextureFileName);
pMaterial->setReflection(reflectionMap);
```

各マテリアルは独自の反射テクスチャを持つことができます。すべてのマテリアル設定は、保存時に.dwg/.dxfファイル内に保存されるため、クライアントアプリケーションは環境マップ反射を使用するために追加のカスタマイズを必要としません。

##### 反射平面マテリアルの有効化

反射平面は.dwgデータベースでネイティブにサポートされておらず、カスタマイズが必要です。.dwgデータベース内のマテリアルの動作をカスタマイズする方法は2つあります。

- OdDbMaterialクラスに基づいたカスタムマテリアルオブジェクトを作成する。
- オーバーライディングを使用して、既存のデータベースマテリアルオブジェクトの動作を変更する。

カスタムデータベースオブジェクトの作成については、Drawing SDKドキュメントの「カスタムエンティティの作成」で説明されています。次の例はよりシンプルで、オーバーライディングを使用し、反射平面レンダリングをサポートするためのマテリアルオブジェクトのカスタマイズを示しています。

```
class MaterialDrawableOverrule : public OdStaticRxObject<OdGiDrawableOverrule>
{
public:
  MaterialDrawableOverrule()
  {
    OdRxOverrule::setIsOverruling(true);
    OdRxOverrule::addOverrule(OdDbMaterial::desc(), this);
  }
  ~MaterialDrawableOverrule()
  {
    OdRxOverrule::removeOverrule(OdDbMaterial::desc(), this);
    OdRxOverrule::setIsOverruling(false);
  }

  virtual bool isApplicable(const OdRxObject* pOverruledSubject) const
  {
    return true;
  }

  virtual OdUInt32 setAttributes(const OdGiDrawable* pSubject, OdGiDrawableTraits *traits)
  {
    OdUInt32 nFlags = OdGiDrawableOverrule::setAttributes(pSubject, traits);
    OdGiMaterialTraitsPtr pMatTraits = OdGiMaterialTraits::cast(traits);
    if (pMatTraits.isNull())
      return nFlags;
    if (OdDbMaterial::cast(pSubject)->name() == OD_T("Material 4"))
    { OdGiMaterialMap mMap;
      pMatTraits->setChannelFlags((OdGiMaterialTraits::ChannelFlags)(pMatTraits->channelFlags() | OdGiMaterialTraits::kUseReflection));
      pMatTraits->setReflectivity(0.5);
      OdGiMaterialMap matMap;
      matMap.setSource(OdGiMaterialMap::kScene);
      matMap.setTexture(OdGiSceneTexture::createObject());
      pMatTraits->setReflection(matMap);
    }
    return nFlags;
  }
};
```

このオーバーライドの例では、「Material 4」という名前のデータベースマテリアルに反射平面を適用します。環境反射と同様に、反射率係数が設定されます。環境反射との主な違いは、マテリアルチャンネルテクスチャとしてOdGiSceneTextureプレースホルダー クラスを使用することです。これは.dwg以外のテクスチャクラスであり、非反射平面マテリアルとの違いを識別するための特別なマテリアルチャンネルです。

あるいは（オーバーライドを使用する代わりに）、OdGiSceneTextureプレースホルダーをデータベースマテリアルに直接設定することもできます。

```
OdDbMaterialPtr pMtl = OdDbDictionary::cast(pDb->getMaterialDictionaryId().safeOpenObject())->getAt(OD_T("Material 4"), OdDb::kForWrite);
pMtl->setChannelFlags((OdGiMaterialTraits::ChannelFlags)(pMtl->channelFlags() | OdGiMaterialTraits::kUseReflection));
pMtl->setReflectivity(0.5);
OdGiMaterialMap matMap;
matMap.setSource(OdGiMaterialMap::kScene);
matMap.setTexture(OdGiSceneTexture::createObject());
pMtl->setReflection(matMap);
```

この種のテクスチャは.dwg/.dxfファイル形式で保存できないため、反射平面は実行時にのみシーンマテリアルに適用できます。.dwg/.dxfファイル形式で保存するには、クライアントアプリケーションでカスタムマテリアルオブジェクトの実装が必要です。

##### 反射平面のソフトネスパラメータ

反射面のマット効果を作成するには、反射平面マテリアルのソフトネスパラメータを使用し、それをOdGiSceneTextureオブジェクトに適用します。

```
OdGiMaterialMap matMap;
matMap.setSource(OdGiMaterialMap::kScene);
OdGiSceneTexturePtr pTexture = OdGiSceneTexture::createObject();
pTexture->setSoftness(1);
matMap.setTexture(OdGiSceneTexture::createObject());
```

ソフトネスパラメータは、生成されたシーンテクスチャをシーンマテリアル表面に描画する前に適用されるぼかし量（ガウスぼかしカーネルサイズ）を表します。ぼかし量が大きいほど、より目立つぼかし効果が得られます。ソフトネスがnull（デフォルト）の場合、ぼかし効果は適用されません。

![softness](/files/inline-images/ex_blur_amount.jpg)##### 反射平面を平面サーフェスに適用する

反射平面マテリアルは平面サーフェスにのみ適用できます。反射平面はシェルジオメトリプリミティブの最初の面法線を使用して生成され、サーフェスを表すシェルに異なる法線が含まれている場合、最終的な反射効果は不正確になります。一方、反射平面マテリアルが適用されるエンティティが、異なる法線を持つ各面を個別のシェルジオメトリプリミティブとして描画する場合、最終的な反射効果は正しく見えます。ただし、この場合、各反射平面は個別のGPUフレームバッファとして表現され、GPUメモリを保持するため、大量のGPUリソースが必要になることに注意してください。また、各反射平面には独自のレンダリングパスが必要であり、最終的なフレームレンダリングパフォーマンスが低下します。大規模なサーフェスセットや非平面サーフェスに反射平面マテリアルを適用することは避け、図面内の他のエンティティに反射平面マテリアルが適用されていないことを確認し、ブロック内のエンティティに反射平面マテリアルを使用することは避けてください。

詳細については、[ODAドキュメント](https://docs.opendesign.com/tv/gi_reflections.html)を参照してください。

## 今すぐ始める

**ODAソフトウェアを60日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
