我想把一个视觉高亮(选择框真的)到一个TGLPlane,其中有许多不同的纹理分配给他们。如何使用GLScene将第二个贴花纹理应用于该平面?
一些背景。应用于平面的各种不同纹理都存储在一个MaterialLibrary中,并分配给相应的平面Material.MaterialLibrary和Material.LibMaterialName。这是纹理的正确有效重用,因为无论使用多少次,它们只加载一次。
您似乎不能做的是使用TGLPlane上的任何属性,因为一旦应用MaterialLibrary纹理,它们就会被忽略。
我可以找到这样做的方法,似乎需要我改变LibMaterial,当然,这也适用于所有其他共享特定纹理的平面,所以这是不可能的。
我在谷歌代码(检查人员)上看到的另一种方法通过创建第二个平面来解决这个问题,该平面具有自己的“高亮”部分透明纹理,然后将其稍微放置在原始对象(恰巧是一个立方体)之上。这似乎是一个绕开它的黑客,如果可能的话,我希望避免这样做。
如果它不是GLScene的内置功能,那么在到达特定平面时是否有方法拦截呈现,然后在应用MaterialLibrary纹理之后使用一些OpenGL基元来应用标记纹理?
发布于 2014-04-14 20:32:43
这里有一种方法,没有应用第二种纹理,但仍然可以制作一个可见的标记。
当加载纹理时,创建一个没有纹理的第二个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保存了原始的材料名,以便我以后可以恢复它。
不完全是我想要的,但效果很好。现在就当这是个解决方案吧。
https://stackoverflow.com/questions/23001066
复制相似问题