Подписаться на RSS рассылку
Главная » Статьи по Delphi » GLScene » Использование PNG в GLScene

Использование PNG в GLScene

Автор: Борисов С. А.

Как же загрузить PNG с альфа каналами в GLScene? Нам понадобятся модули TPNGImage. Скачиваем, копируем в папку все файлы \Borland\Delphi7\Lib. Папку obj тоже нужно будет скопировать.

Теперь создаем новый проект и делаем самое простое приложение на GLScene. Добавим в сцену TGLHUDSprite. Это и будет наша PNG картинка.

Теперь необходимо настроить несколько свойств у GLHUDSprite1.

1. Material.BlendingMode := bmTransparency
2. Material.Texture.Disabled := False
3. Material.Texture.TextureMode := tmReplace
4. Width := размер по ширине для вашего изображения
5. Height := размер по высоте для вашего изображения
6. Position.X := положение по горизонтали
7. Position.X := положение по вертикали

Добавляем следующие модули в раздел Uses:

Uses GLTexture, GLGraphics, PNGImage;

Они нам потребуются позже. Теперь пишем процедуру загрузки нашего изображения. FileName это путь к PNG файлу

procedure LoadPNG(FileName: string; t: TGLTexture);
var FMap: TGLBitmap32;
    bmp: TBitmap;
    png: TPNGObject;
    i,j: integer;
    p: PGLPixel32Array;
    pb: PByteArray;
begin
  if (FileExists(FileName))and(LowerCase(ExtractFileExt(FileName))='.png') then
  begin
    png := TPNGObject.Create;
    png.LoadFromFile(FileName);

    FMap:=TGLBitmap32.Create;

    if png.TransparencyMode = ptmPartial then
    begin
      FMap.Width := png.Width;
      FMap.Height := png.Height;

      for j:=0 to png.Height-1 do
      begin
        pb := png.Scanline[j];
        p := Fmap.ScanLine[png.Height-j-1];
        for i:=0 to png.Width-1 do
        begin
          p[i].r := pb[i*3+2];
          p[i].g := pb[i*3+1];
          p[i].b := pb[i*3];
          p[i].a := png.AlphaScanline[j][i];
        end;
      end;
      png.Free;
    end
    else
    begin
      bmp:=TBitmap.Create;
      png.AssignTo(bmp);
      FMap.Assign(bmp);
      bmp.Free;
    end;

    t.Image.Assign(FMap);
    FMap.Free;
  end;
end;

Теперь осталось только вызвать процедуру, например в OnCreate формы.

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadPNG('Test.png', GLHUDSprite1.Material.Texture);
end;

Единственный недостаток - получается не резкое изображение. Можно сделать немножко порезче, если у текстуры установить FilteringQuality = tfAnisotropic и MagFiltr = maNearest.

Просмотров: 5806

Обсудить на форуме

0   Спам
(31.05.2011)
1. Vray
Проверил загрузку .png через меню материала, все работает итак с альфа каналом без использования Uses GLTexture, GLGraphics, PNGImage; и т. д.
В меню материала нужно выбрать загружаемую картинку и в том же меню Blending Mode=bmTransparency. Правда использовал Delphi2010 и GLSceneOctober'2010.
P. S. Смайлы желтые (что слева) в комментариях как делать? =)


Имя *:
Email:


Код *:

Copyright © 2008-2016 Программирование на Delphi для начинающих и не только

Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации

Хостинг от uCoz

Автор проекта: Борисов Сергей

e-mail: save-x@yandex.ru

Связь с администрацией сайта