Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Загрузка текстуры из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.039 c
6-1132092302
Volf_555
2005-11-16 01:05
2006.02.26
Как по сети копировать папки с файлами?


3-1135776468
VICTOR_MV
2005-12-28 16:27
2006.02.26
BDE. Два разных ПО не могут одновременно работать.


15-1139058841
VseHotjatIJaHo4u
2006-02-04 16:14
2006.02.26
Таймер, Т_Т


2-1138874187
Juice
2006-02-02 12:56
2006.02.26
Rave Reports, проблемы с кириллицей


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский