Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

Загрузка текстуры из TBItmap   Найти похожие ветки 

 
RzCoDer ©   (2005-08-31 17:41) [0]

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

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


 
RzCoDer ©   (2005-08-31 17:44) [1]

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


 
RzCoDer ©   (2005-08-31 17:44) [2]

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


 
grouzd[E]v ©   (2005-08-31 19:05) [3]

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

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


 
MeF Dei Corvi ©   (2005-08-31 19:41) [4]


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

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


 
RzCoDer ©   (2005-08-31 20:16) [5]

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


 
grouzd[E]v ©   (2005-08-31 20:46) [6]

> [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 ...


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

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


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

Зачем так делать?! Этож БМП, у него структура не сложная, только вот 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;


 
MeF Dei Corvi ©   (2005-09-01 11:49) [9]


> только вот 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.


 
RzCoDer ©   (2005-09-01 16:32) [10]

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


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

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 <(*bmp).Height; y++ ){                       // Циклы "проходящие" по текстуре
 pDst16 = (DWORD*)pDstRow;                               // Получаем строку
 for( x=0; x <(*bmp).Width; x++ ){                       //
  R= GetRValue ((*(*bmp).Canvas).Pixels [x][y]);         // Передаем количество красного
  G= GetGValue ((*(*bmp).Canvas).Pixels [x][y]);         // Передаем количество зеленого
  B= GetBValue ((*(*bmp).Canvas).Pixels [x][y]);         // Передаем количество синего

  A=255;                                                 // Устанавливаем значение прозрачности
  if ((*(*bmp).Canvas).Pixels[x][y]==alpha_color)        //
   A = 0;                                                //

  *pDst16++ = D3DCOLOR_ARGB(A, R, G, B);                 // Передаем цвет
 }
 pDstRow += d3dlr.Pitch;                                 //
}
(*Texture).UnlockRect(0);                                // "Отдаем" текстуру
return(Texture);                                         // Возращаем ее

}


 
A22 ©   (2005-09-01 17:02) [12]

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


 
MeF Dei Corvi ©   (2005-09-01 17:34) [13]


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

Так круче! :)


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


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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
4-1134246335
Matrex
2005-12-10 23:25
2006.02.26
Работа с сотовым телефоном


15-1139232268
Игорь Шевченко
2006-02-06 16:24
2006.02.26
Очередная дырка в Windows или не смотрите метафайлы


2-1139302759
Flex_
2006-02-07 11:59
2006.02.26
Что за класс TTreeNode и с чем его едят?


2-1139228154
~viper~
2006-02-06 15:15
2006.02.26
Проверка почты


2-1139569824
BaBayka007
2006-02-10 14:10
2006.02.26
Подскажите пожалуйста неопытному....