문제

나는 많은 tglplane의 하나에 시각적 하이라이트 (선택 상자를 정말로)를 넣고, 많은 다른 질감이 그들에게 할당 된 많은 tglplane 중 하나 위에 놓고 싶습니다. GLSCENE을 사용하여 해당 비행기에 두 번째 데칼 텍스처를 어떻게 적용합니까?

일부 배경. 평면에 적용된 다양한 다른 텍스처는 모두 재료에 저장되어 각 비행기 재료에 할당됩니다. 재료 및 material.libmaterialname. 이것은 사용되는 몇 번에 관계없이 한 번만로드되는 텍스처의 적절한 효율적인 재사용입니다.

당신이 할 수없는 것은 TGLPlANT의 속성을 사용하면 재료의 질감을 적용하면 무시되기 때문에 tglplane의 속성을 사용하는 것입니다.

이렇게 할 수있는 방법은 나를 libmaterial을 바꾸는 것을 요구하는 것처럼 보입니다. 물론 특정 텍스처를 공유하는 다른 모든 비행기에 적용되는 것은 아니므로 노이가 없습니다.

Google 코드 (체크인) 자체적으로 '강조 표시'부분적으로 투명한 텍스처가 적용된 두 번째 비행기가 원래의 객체 (큐브가 발생한 큐브) 위에 놓여 있습니다. 이것은 그것을 주위를 돌리기위한 해킹처럼 보입니다. 가능하면 그것을 피하기를 희망합니다.

GLSCENE에 대한 내장 기능이없는 경우 특정 평면에 도착하면 렌더링을 가로 챌 수있는 방법이 있고 MateriAllibrary 텍스처가 적용된 후에 데칼 텍스처를 적용하기 위해 일부 OpenGL 프리미티브를 사용하는 방법이 있습니까?

도움이 되었습니까?

해결책

두 번째 텍스처를 적용하지 않고 한 가지 방법이지만 그럼에도 불구하고 가시적 인 마커를 만듭니다.

텍스처를로드 할 때 텍스처없이 두 번째 TGLLIBMateRial을 만들지 만 '선택한'텍스처를 사용하려는 수정을 원하는 "강조 표시"수정을 사용하여 '선택된' '을 제외하고는 이름에 추가합니다.

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