Opengl. Смена содержания текстуры...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Opengl. Смена содержания текстуры...

Сообщение mildok » 07.05.2011 18:52:38

Здравствуйте :D.
В текущей версии программульки я делал:
Код: Выделить всё
tmpbmp.Handle:=CreateDIBSection(tmpbmp.canvas.handle,BInfo,DIB_RGB_COLORS, bits ,0,0);

tmpbmp - TBitmap
И, в дальнейшем, принимал по сети данные прямо в bits, после чего:
Код: Выделить всё
form1.image1.picture.bitmap:=tmpbmp;

И всё было прекрасно, но получается большая нагрузка на проц, если данные принимаются постоянно...(хотя бы 3 кадра в секунду)
Я думаю, что процесс отображения в TImage нагружает проц.

И поэтому хочу перейти на opengl. Как я понял нужно сформировать текстуру и натянуть на квад - тут всё понятно. Но у меня вопрос появился.
Вопрос: в процессе создания текстуры участвуют функции:
Код: Выделить всё
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData);
или
  glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, pData);

pData - указатель на область памяти, где лежат данные для текстуры

Так вот - если я данные, которые по сети ко мне приходят, буду загонять в pData будет ли меняться текстура? Или мне нужно будет с каждым новым кадром создавать заново текстуру? Подскажите что-то вроде "динамической текстуры"...
Заранее благодарю :D..
mildok
новенький
 
Сообщения: 22
Зарегистрирован: 08.05.2010 14:09:36

Re: Opengl. Смена содержания текстуры...

Сообщение mildok » 15.05.2011 16:14:38

Блин, ну опять мне нихто не отвечает... :( ...Хотя я, конечно, глупый вопрос задал... :D.
Ну и ладно...буду сам с собою правою рукою, вслух разговаривать .. :mrgreen: ..
Способ 1). Действительно, чтобы изменить содержание текстуры нужно всего лишь заюзать функции glTexImage2d, или glTexSubImage2D(предварительно, с помощью glBindTexture, указав текстуру, которую будем менять).

Но - это не совсем то, чего бы хотелось :D.

Способ 2).Так вот оказывается можно су помощью pData:=glMapBufer, указать волшебную переменную pData, в которой и будут валяться данные текстурки...В дальнейшем, как я понимаю можно просто пихать "данные-по_сети-приходящие" в pData и я буду счастлив..
Конечно, перед glMapBufer надо подготовиться, а именно:
Код: Выделить всё
glGenBuffersARB := wglGetProcAddress('glGenBuffersARB');
glBindBufferARB := wglGetProcAddress('glBindBufferARB');
glMapBufferARB := wglGetProcAddress('glMapBufferARB');
glUnmapBufferARB := wglGetProcAddress('glUnmapBufferARB');
  glBufferDataARB := wglGetProcAddress('glBufferDataARB');

glGenBuffersARB(1,@NameBuf);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER,NameBuf);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER,bi.bmWidth*(bi.bmBitsPixel div 8)*bi.bmHeight,0,GL_STREAM_DRAW);
p2:=glMapBufferARB(GL_PIXEL_UNPACK_BUFFER,GL_WRITE_ONLY); //Вызываем glMapBufferARB...Приём-приём...Аллё!
copymemory(p2, p, bi.bmWidth*(bi.bmBitsPixel div 8)*bi.bmHeight);
  glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER);

...
glFlush;
SwapBuffers(DcPanel); //И ничё на экране не происходит =(

В программе участвовали:
NameBuf:GLuint;
p2,p:Pointer;
DcPanel:HDC;

DcPanle:=getdc(Panel1.handle);

Первый способ у меня получается - второй нет... :(
В p точно есть данные из Bmp-картинки.

Кстати, в интернете нашёл тысячу и один способ загрузки в Opengl Bitmap'а. Но они какие-то сложные все для проца. Я вот так вот сделал:
Код: Выделить всё
var
    b: TBitmap;   
    bi:BITMAP; 

Begin
b := TBitmap.Create;
b.LoadFromFile('images\Oblogka2.bmp');

//Получаем данные о картинке(нас интересует bi.bmBits - указатель на область памяти, где картинка и находится)
GetObject(b.handle,Sizeof(BITMAP),@bi);
//Дальше - рисуем на текстуре. glBindTexture у меня уже вызвана была, так что тут не надо.
//Говорим Opengl, что строка изображения в памяти должна быть длиной в bi.bmWidth
glPixelStorei(GL_UNPACK_ROW_LENGTH, bi.bmWidth );
//Обновляем текстуру
glTexImage2d(GL_TEXTURE_2D, 0, 3, bi.bmWidth, bi.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, bi.bmBits);
//Убираем выравнивание
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0 );     

//Прощай - bitmap :'( !
b.free;
End;

Коротенький - красивый способ... :D
Вопрос : этот способ чреват для меня чем-нибудь, кроме картинки "вверх ногами"? Я потом в opengl переворачиваю картинку, довольно просто:
Код: Выделить всё
glBindTexture(GL_TEXTURE_2D, tex1);
glBegin(GL_QUADS);
   glTexCoord2f(0, 0); glVertex2f(-3, 3);
   glTexCoord2f(0, 1); glVertex2f(-3, -3);
   glTexCoord2f(1, 1); glVertex2f(3, -3);
   glTexCoord2f(1, 0); glVertex2f(3, 3);
glEnd();       

И ещё - glPixelStorei(GL_UNPACK_ROW_LENGTH, bi.bmWidth ); - единственное выравнивание, которое у меня сработало.. :)
Главный вопрос: пичму может не работать 2 способ (ошибок мне никаких не кажет)...
mildok
новенький
 
Сообщения: 22
Зарегистрирован: 08.05.2010 14:09:36


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru