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

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

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

Ответить
mildok
новенький
Сообщения: 22
Зарегистрирован: 08.05.2010 14:09:36

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

Сообщение mildok »

Здравствуйте :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 »

Блин, ну опять мне нихто не отвечает... :( ...Хотя я, конечно, глупый вопрос задал... :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 способ (ошибок мне никаких не кажет)...
Ответить