2014-04-10 44 views
1

我想將一個視覺高光(真的選擇框)放到許多TGLPlane中,其中有許多不同的紋理分配給它們。我將如何使用GLScene將第二貼花紋理應用於該平面?GLScene中的貼花紋理

一些背景。應用於平面的各種不同紋理都存儲在MaterialLibrary中,並分配給相應的平面Material.MaterialLibrary和Material.LibMaterialName。這是紋理的高效重用,因爲它們只加載一次,無論使用多少次。

你看起來不能做的就是使用TGLPlane上的任何屬性,因爲一旦你應用了MaterialLibrary紋理就會被忽略。

我發現這樣做的方法似乎要求我改變LibMaterial,當然這適用於所有其他共享該特定紋理的平面,所以這是一個禁忌。

我在Google Code (Checkers)發現的另一種方法是通過創建第二個平面來解決問題,該平面具有自己的「高光」部分透明紋理,然後將其稍微放置在原始對象(正好是一個立方體)的上方。這似乎是一個黑客繞過它,我希望儘可能避免這種情況。

如果它不是GLScene的內置功能,那麼是否有一種方法可以在渲染到達該特定平面時攔截渲染,然後在應用MaterialLibrary紋理之後使用一些OpenGL基元來應用貼花紋理?

回答

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保存原始材料名稱,以便日後恢復。

不完全是我想要的,但它的工作原理。暫時稱之爲解決方法。