Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузка текстуры из TBItmap [Delphi]


RzCoDer ©   (2005-08-31 17:41:00) 

Вопрос. Как загрузить текстуру из TBitmap или из TMemoryStream. Желательно пример.

P.S. http://delphigfx.mastak.ru/- не предлагать, был, не нашёл... :(


Кефир87   (2005-09-01 21:42:00) [1]


> Есть такой формат GL_BGR...

Ты открыл мне глаза. я не знал. Но во всех примерах (даже у Яна Хорна) делается BGR->RGB свапинг... хм...

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

>  glGenTextures(1, id);
>  glBindTexture(GL_TEXTURE_2D, id);
>
>  Result := id;

За то работает.


MeF Dei Corvi   (2005-09-01 17:34:00) [2]


> и так есть функция создания текстуры из файла

Так круче! :)


A22   (2005-09-01 17:02:00) [3]

а смысл в коде для директа? в D3DX и так есть функция создания текстуры из файла


Voland2002   (2005-09-01 16:53:00) [4]

IDirect3DTexture8 *CreateTextureFromBMP(Graphics::TBitmap *bmp){
BYTE* pDstRow;                                            // Массив битов
DWORD* pDst16;                                            //
IDirect3DTexture8 *Texture;                               // Созданая текстура
D3DLOCKED_RECT d3dlr;                                     // Область охвата
int x,y;                                                  // Вспомагательные переменные
Byte A,R,G,B;                                             // Значения цветов
TColor alpha_color;                                       // Цвет прозрачности
 alpha_color=(*(*bmp).Canvas).Pixels[0][0];

 // Создаем текстуру
(*D8_Device).CreateTexture ((*bmp).Width, (*bmp).Height, 0, 0, D3DFMT_A8R8G8B8,
                           D3DPOOL_MANAGED, &Texture);

(*Texture).LockRect( 0, &d3dlr, 0, 0 );                  // Захватываем созданную текстуру
pDstRow = (BYTE*)d3dlr.pBits;                            // Получаем массив битов
for( y=0; y


RzCoDer   (2005-09-01 16:32:00) [5]

Всё таки я сделал это :)
Всем сюда: http://www.rushvild.mirg.ru/Textures.rar


MeF Dei Corvi   (2005-09-01 11:49:00) [6]


> только вот BGR...:

А причем здесь BGR?
>  if mode = GL_RGB then
>  begin
>    For x := 0 to bmi.biWidth*bmi.biHeight-1 do
>    begin
>      With TWrap(pData^)[x] do
>      begin
>        temp := r;
>        r := b;
>        b := temp;
>      end;
>    end;
>  end;

Это лишнее... Есть такой формат GL_BGR...
> Зачем так делать?! Этож БМП

Суть вопроса не в том, как bmp загрузить, а в том, как сделать текстуру из TBitmap.


Кефир87   (2005-08-31 23:45:00) [7]

Зачем так делать?! Этож БМП, у него структура не сложная, только вот BGR...:

function  tgLoadTextureBMP(const FileName:string):GLuint;
const
 szh = SizeOf(BITMAPFILEHEADER);
 szi = SizeOf(BITMAPINFOHEADER);
type
 TRGB = record
   r, g, b : GLbyte;
 end;
 TWrap = Array [0..0] of TRGB;
var
 BmpFile : File;
 bfh     : BITMAPFILEHEADER;
 bmi     : BITMAPINFOHEADER;
 x, size : GLint;
 temp    : GLbyte;
 pData   : pointer;
 mode    : Cardinal;
 id      : GLuint;
begin

 mode := GL_RGB;

 AssignFile (BmpFile, FileName);
 Reset (BmpFile, 1);
 Size := FileSize (BmpFile) - szh - szi;

 Blockread(BmpFile, bfh, szh);
 BlockRead(BmpFile, bmi, szi);

 If Bfh.bfType <> $4D42 then
 begin
   CloseFile(BmpFile);
   Result := 0;
   Exit;
 end;

 GetMem (pData, Size);

 if pData = nil then
 begin
   CloseFile(BmpFile);
   Result := 0;
   Exit;
 end;

 BlockRead(BmpFile, pData^, Size);
 case bmi.biBitCount div 8 of
   1 : mode := GL_RED;
   2 : mode := GL_RGB;
   3 : mode := GL_RGB;
   4 : mode := GL_RGBA;
 end;

 if mode = GL_RGB then
 begin
   For x := 0 to bmi.biWidth*bmi.biHeight-1 do
   begin
     With TWrap(pData^)[x] do
     begin
       temp := r;
       r := b;
       b := temp;
     end;
   end;
 end;

 glGenTextures(1, id);
 glBindTexture(GL_TEXTURE_2D, id);

 Result := id;

 GenTexture(bmi.biWidth, bmi.biHeight, bmi.biBitCount, mode, pData);

 FreeMem(pData);
 CloseFile(BmpFile);
end;

procedure GenTexture(width,height:Integer;BPP:byte;format:Cardinal;pData:Pointer);
begin
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

 gluBuild2DMipmaps(GL_TEXTURE_2D, BPP div 8, width, height, format, GL_UNSIGNED_BYTE, pData)
end;


Dispirited Zeqfreed   (2005-08-31 21:09:00) [8]

Возможно, поможет.
http://www.sulaco.co.za/opengl5.htm#bmp


grouzd[E]v   (2005-08-31 20:46:00) [9]

> [4] MeF Dei Corvi ©   (31.08.05 19:41)
Пардон, не заметил букву Т в начале => думал что проблема в загрузке
из bmp файла

> [5] RzCoDer ©   (31.08.05 20:16)
glTexImage2D / gluBuild2DMipmaps?
Лучше напиши код

---
... we are walking on a thin line and you better avoid the risk ...


RzCoDer   (2005-08-31 20:16:00) [10]

grouzd[E]v, есть bitmap надо из него сделать opGL текстуру.


MeF Dei Corvi   (2005-08-31 19:41:00) [11]


> загрузить, создать или "надеть" на объект?

исходя из вопроса, думаю не получается получить данные из TBitmap и запихнуть их в видяху.


grouzd[E]v   (2005-08-31 19:05:00) [12]

Что именно не получается - загрузить, создатьили "надеть" на объект?

---
... we are walking on a thin line and you better avoid the risk ...


RzCoDer   (2005-08-31 17:44:00) [13]

Забыл сказать всё это на OpenGL


RzCoDer   (2005-08-31 17:44:00) [14]

Забыл сказать всё это на OpenGL


Наверх

Титульная страница Поиск, карта сайта Написать письмо