Форум: "Игры";
Текущий архив: 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