![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток.
Нашёл библиотеку (UrickGL, U3Dpolys, GL, GLU, Glut ) в которой просто можно работать OpenGL и решил поизучать её и вставить в проект. Столкнулся с "неудобностью" библиотеки - текстуры надо грузить из файла во время работы программы. Можно ли их хранить в ресурсах или допустим загрузить в TImage и оттуда уже грузить картинку в текстуру?При этом я могу в неё сразу рисовать и печатать текст модифицируя её!! Я же могу и имею доступ к битовому пространству картинки в Image.. Но вот не соображу как это совместить передачей в текстуру. Привожу оригинальный код создания текстуры с загрузкой по имени файла xxxx.bmp. Код:
Function TTexture.LoadTexture(st:string):shortint; // сейчас так
//Function TTexture.LoadTextureIMG(IMG:TImage):shortint; // хотелось бы так
Const
MB=19778;
type
ptybuff=^tybuff;
ptybuffa=^tybuffa;
tybuff=array[1..128000] of record
r:byte;
g:byte;
b:byte;
end;
tybuffa=array[1..128000] of record
r:byte;
g:byte;
b:byte;
a:byte;
end;
var
f:file;
Buffer2b:ptybuff;
Buffer2:pointer;
Buffer3b:ptybuffa;
Buffer3:pointer;
i:longint;
{$A-}
header:record
FileType:Word; {always MB}
size:longint;
Reserved1,
Reserved2:word; {reserved for future purposes}
offset:longint; {offset to image in bytes}
end; {header}
BMPInfo:record
size:longint; {size of BMPinfo in bytes}
width:longint; {width of the image in pixels}
height:longint; {height of the image in pixels}
planes:word; {number of planes (always 1)}
Colorbits:word; {number of bits used to describe color in each pixel}
compression:longint; {compression used}
ImageSize:longint; {image size in bytes}
XpixPerMeter:longint; {pixels per meter in X}
YpixPerMeter:longint; {pixels per meter in Y}
ColorUsed:longint; {number of the color used їїї???}
Important:longint; {number of "important" colors}
end; {info}
{$A+}
begin
if Not FileExists(st) then
begin
result:=-1; {file not found}
exit;
end;
assignfile(f,st);
reset(f,1);
blockread(f,header,sizeof(header));
blockread(f,BMPinfo,sizeof(BMPinfo));
if header.FileType <> MB then
begin
result:=-2; {file type is not BMP}
exit;
end;
header.size:=header.size-sizeof(header)-sizeof(BMPinfo);
getmem(buffer2,header.size);
getmem(buffer3,header.size*4 div 3);
buffer2b:=ptybuff(buffer2);
buffer3b:=ptybuffA(buffer3);
Blockread(f,buffer2^,header.size);
for i:=1 to header.size div 3 do
begin
buffer3b^[i].r:=buffer2b^[i].b;
buffer3b^[i].g:=buffer2b^[i].g;
buffer3b^[i].b:=buffer2b^[i].r;
buffer3b^[i].a:=envblendcolor[3]; {obtain blend alpha from envblendcolor.alpha}
end;
closefile(f);
GlNewList(MyList,gl_compile);
glpixelstorei(gl_unpack_alignment,4); {OpenGL 1.0 ignores this one}
glpixelstorei(gl_unpack_row_length,0);
glpixelstorei(gl_unpack_skip_rows,0);
glpixelstorei(gl_unpack_skip_pixels,0);
{for GLteximage2D the parameters are:
gl_Texture_2d,
level of detail (0 unless using mipmapped textures)
components: 3 for RGB, 4 for RGBA 1 for indexed 256 color
width, height
border: width of the border, between 0 and 2.
Format: gl_color_index, GL_RGB, GL_rgbA, GL_luminance are the most used
type of the data for each pixel
pointer to image data}
glenable(GL_BLEND);
glblendfunc(gl_src_alpha, gl_one_minus_src_alpha);
gltexImage2d(gl_texture_2d,0,4,BMPinfo.width,BMPinfo.height,0,gl_rgba,gl_unsigned_byte,buffer3);
glendlist;
result:=0; {no error}
end;имеем вызов: Код:
Cube1.texture.LoadTexture('texture3.bmp');Код:
Cube1.texture.LoadTextureIMG(image1); Понятно что уже нет необходимости проверять битность, есть файл или нет, проверять заголовок, надо просто как-то сразу обратиться в область данных и передать этот массив.. туплю - не соображу. ![]() |
|
#2
|
|||
|
|||
|
Ну, если по простому, я бы модернизировал бы этот код под чтение из потока (TStream). А там дальше что ты подсунешь (TFileStream, TMemoryStream или какой другой поток, TResourceStream например) уже не важно.
Собственно, для модификации нужно поменять стрки: 1 - вместо имени файла передавать ссылку на TStream 49-53 - убрать вообще или хотя бы проверять данные в потоке (что они есть - size > 0) 54-55 - Stream.seek(0,0) - на всякий случай ставим указатель в начало потока 56-57б68 - меняем на чтение из потока 76 - убрать. тот, кто создал поток, пусть его и закрывает Как-то так. |
|
#3
|
|||
|
|||
|
Если честно не работал с потоками.. Ну мы тем самым имитируем работу с диском только в памяти..
Я думал выкинуть "псевдо" работу с диском а как-то влезть в blockread - в буфер перебросить данные с памяти image1.Picture.Bitmap сразу в buffer3b |
|
#4
|
|||
|
|||
|
Ну, наверное, можно.
Просто выкидывается вся работа с файлом, а строки 69-75 поменять на использование ScanLine. Через ScanLine получается доступ к триплетам (RGB) битмапа. |