![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка текстуры из 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