Блин, ну опять мне нихто не отвечает...
...Хотя я, конечно, глупый вопрос задал...
.
Ну и ладно...буду сам с собою правою рукою, вслух разговаривать ..
..
Способ 1). Действительно, чтобы изменить содержание текстуры нужно всего лишь заюзать функции
glTexImage2d, или
glTexSubImage2D(предварительно, с помощью glBindTexture, указав текстуру, которую будем менять).
Но - это не совсем то, чего бы хотелось
.
Способ 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;
Коротенький - красивый способ...
Вопрос : этот способ чреват для меня чем-нибудь, кроме картинки "вверх ногами"? Я потом в 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 способ (ошибок мне никаких не кажет)...