1

多くの異なるテクスチャが割り当てられている多くの TGLPlane の 1 つに視覚的なハイライト (実際には選択ボックス) を配置したいと考えています。GLScene を使用して、その平面に 2 番目のデカール テクスチャを適用するにはどうすればよいですか?

いくつかの背景。プレーンに適用されるさまざまなテクスチャはすべて MaterialLibrary に保存され、それぞれのプレーン Material.MaterialLibrary および Material.LibMaterialName に割り当てられます。これは、テクスチャが何回使用されても 1 回だけロードされるため、テクスチャの適切な効率的な再利用です。

MaterialLibrary テクスチャを適用すると無視されるため、TGLPlane のプロパティを使用することはできないようです。

そうするために私が見つけることができる方法は、もちろん、その特定のテクスチャを共有する他のすべての平面に適用される LibMaterial を変更する必要があるようです。

Google Code (Checkers)で見つけた別の方法は、独自の「ハイライト」部分的に透明なテクスチャが適用された 2 番目の平面を作成し、元のオブジェクト (たまたま立方体) の少し上に配置することで問題を解決します。これは回避するためのハックのように思えますが、可能であれば回避したいと考えています。

GLScene の組み込み機能でない場合、その特定の平面に到達したときにレンダリングをインターセプトし、いくつかの OpenGL プリミティブを使用して、MaterialLibrary テクスチャが適用された後にデカール テクスチャを適用する方法はありますか?

4

1 に答える 1

0

これは、2 番目のテクスチャを適用せずに、可視マーカーを作成する方法の 1 つです。

テクスチャをロードするとき、テクスチャなしで 2 番目の TGLLibMaterial を作成しますが、「選択した」テクスチャに加えたい「ハイライト」変更を加えて、名前に「-selected」を追加する以外は同じように呼び出します。

fMatLib.AddTextureMaterial('empty','empty.bmp', False);

with TGLLibMaterial.Create(fMatLib.Materials) do begin
  Material.MaterialLibrary := fMatLib;
  Texture2Name := 'empty';
  Name := 'empty-selected';
  Material.FrontProperties.Emission.Color := clrRed;
  Material.Texture.ImageBrightness := 1.5;
end;

テクスチャをリロードしないため、これはテクスチャ メモリを消費しません。

次に、コードで強調表示するオブジェクトを特定し、次のようにします。

fPickedMaterial := fPickedObject.Material.LibMaterialName;
fPickedObject.Material.LibMaterialName :=
  fPickedObject.Material.LibMaterialName + '-selected';

fPickedMaterial は元のマテリアル名を保存して、後で復元できるようにします。

私が望むものとは完全ではありませんが、うまくいきます。今のところ回避策と呼んでください。

于 2014-04-14T20:32:43.783 に答える