Вопрос

Я хочу поставить Visual Highlight (действительно в поле выбора) на один из многих TGLPlane, которые имеют множество различных текстур, назначенных им. Как бы я применить вторую текстуру наклейки к тому самолету, используя glscene?

Какой-то фон. Различные различные текстуры, применяемые к плоскостям, все хранятся в материализированном и присвоенном соответствующим плоскостям материала. Материал. Материаллибрарный и материал. LibMaterialName. Это правильное эффективное повторное использование текстур, поскольку они загружены только один раз независимо от того, сколько раз они используются.

Что вы не можете, казалось бы, это использовать, это использовать какие-либо из свойств на Tglplane, потому что они игнорируются, как только вы применяете материальную текстуру.

Методы, которые я могу найти для этого, кажется, требуют, чтобы я изменил либератериал, который, конечно, применяется ко всем другим плоскостям, которые разделяют эту конкретную текстуру, так что это неисправность.

Другой метод, который я заметил в Google Code (Checkers) решает проблему, создавая Вторая плоскость, которая имеет собственную «выделение» частично прозрачной текстуры, которая затем находится чуть выше оригинального объекта (куба, как это происходит). Это похоже на взлом, чтобы обойти его, и я надеюсь избежать этого, если это возможно.

Если его не встроенный способность к GLSCENE, то есть метод для перехвата рендеринга, когда он попадает в эту конкретную плоскость, а затем использовать некоторые примитивы OpenGL для применения текстуры наклейки после применения материальной текстуры?

Это было полезно?

Решение

Вот один метод, не применяя вторую текстуру, но тем не менее сделать видимый маркер.

При загрузке текстур создайте второй TGLLIBMATERIAL без текстуры, но с помощью того, что «подсвечивает» модификации, которые вы хотите сделать на вашей «выбранной» текстуре, и вызовите его, кроме как с «-сверенным», добавленным к названию. .

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 сохраняет исходное имя материала, чтобы я мог восстановить его позже.

Не идеально то, что я хочу, но это работает.Назовите это работой на данный момент.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top