質問

私は視覚的なハイライト(本当に選択ボックス)を多くのTGLプレーンのうちの1つに置きたいと思っています。 GLSCENEを使用してその平面に2番目のデカールテクスチャをどのように適用しますか?

いくつかの背景。平面に適用されるさまざまな異なるテクスチャはすべてマテリアリブラリーに格納され、それぞれの平面材料。これは、それらが使用されている回数にかかわらず一度だけロードされているため、テクスチャの適切な効率的な再利用です。

あなたが一見することができないのは、マテリアリブラステクスチャをそれに適用すると、TGLPLANE上のプロパティのいずれかを使用することです。

私がするために私が見つけることができる方法は私がその特定のテクスチャを共有する他のすべての飛行機に適用されるlibMaterialを変更することを私に要求するように思われるので、それは無地です。

Google Code(Checker)を作成して問題を解決するそれはそれ自身の「ハイライト」の「一部の部分的に透明なテクスチャを適用しています。これは、元のオブジェクトのわずかに上方に配置されます(それが起こっているように立方体)。これはそれを回避するためのハックのように思えます、そして可能な限り避けてください。

GLSCENEの構築能力ではない場合は、その特定の平面に着くときにレンダリングを傍受する方法があり、次にマテリアリブラリーテクスチャの後にデカールテクスチャを適用するためにいくつかのOpenGLプリミティブを使用する方法がありますか?

役に立ちましたか?

解決

これは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は後で復元できるように元の素材名を保存します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top