1

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

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

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

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

我在Google Code (Checkers)中发现的另一种方法通过创建第二个平面来解决这个问题,该平面应用了它自己的“突出显示”部分透明纹理,然后将其放置在原始对象(恰好是一个立方体)的略上方。这似乎是一种绕过它的技巧,我希望尽可能避免这种情况。

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

4

1 回答 1

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 保存原始材质名称,以便我以后可以恢复它。

不完全是我想要的,但它有效。暂时称其为解决方法。

于 2014-04-14T20:32:43.783 回答