GLScene中的贴花纹理

时间:2014-04-10 23:44:37

标签: glscene

我想要将一个视觉突出显示(真正的选择框)放在许多TGLPlane之一上,这些TGLPlane分配了许多不同的纹理。如何使用GLScene将第二个贴花纹理应用于该平面?

一些背景知识。应用于平面的各种不同纹理都存储在MaterialLibrary中,并分配给相应的平面Material.MaterialLibrary和Material.LibMaterialName。这是对纹理的有效重用,因为它们只被加载一次,无论它们使用了多少次。

您可以做的似乎是使用TGLPlane上的任何属性,因为一旦您将MaterialLibrary纹理应用于它,它们就会被忽略。

我可以找到这样做的方法似乎要求我改变LibMaterial,这当然适用于所有其他共享特定纹理的平面,这样就不行了。

我在Google Code (Checkers)发现的另一种方法是通过创建第二架飞机来解决这个问题,这架飞机拥有它自己的“突出显示”。应用部分透明纹理,然后将其放置在原始对象(正好是多维数据集)的上方。这似乎是一种破解它的方式,我希望尽可能避免这种情况。

如果它不是GLScene的内置功能,那么是否有一种方法可以在渲染到达特定平面时拦截渲染,然后使用一些OpenGL基元在应用MaterialLibrary纹理后应用贴花纹理?

1 个答案:

答案 0 :(得分:0)

这是一种方法,不应用第二种纹理,但仍然可以制作可见标记。

加载纹理时,创建第二个没有纹理的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保存原始材料名称,以便我以后可以恢复它。

不完全是我想要的,但它确实有效。现在称之为解决方案。