首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLScene中的贴花纹理

GLScene中的贴花纹理
EN

Stack Overflow用户
提问于 2014-04-10 23:44:36
回答 1查看 429关注 0票数 1

我想把一个视觉高亮(选择框真的)到一个TGLPlane,其中有许多不同的纹理分配给他们。如何使用GLScene将第二个贴花纹理应用于该平面?

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

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

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

我在谷歌代码(检查人员)上看到的另一种方法通过创建第二个平面来解决这个问题,该平面具有自己的“高亮”部分透明纹理,然后将其稍微放置在原始对象(恰巧是一个立方体)之上。这似乎是一个绕开它的黑客,如果可能的话,我希望避免这样做。

如果它不是GLScene的内置功能,那么在到达特定平面时是否有方法拦截呈现,然后在应用MaterialLibrary纹理之后使用一些OpenGL基元来应用标记纹理?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-14 20:32:43

这里有一种方法,没有应用第二种纹理,但仍然可以制作一个可见的标记。

当加载纹理时,创建一个没有纹理的第二个TGLLibMaterial,但是要对您的“选定的”纹理进行任何“突出显示”修改,并将其称为相同的,除非附加在名称上的是'-selected‘。

代码语言:javascript
复制
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;

这不会消耗纹理内存,因为您没有重新加载纹理。

然后,在您的代码中,标识您希望突出显示的对象,并执行类似的操作。

代码语言:javascript
复制
fPickedMaterial := fPickedObject.Material.LibMaterialName;
fPickedObject.Material.LibMaterialName :=
  fPickedObject.Material.LibMaterialName + '-selected';

fPickedMaterial保存了原始的材料名,以便我以后可以恢复它。

不完全是我想要的,但效果很好。现在就当这是个解决方案吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23001066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档