Войти
ПрограммированиеФорумГрафика

Как поменять местами красный и синий каналы средствами OpenGL при выводе изображения[SOLVED]

Страницы: 1 2 Следующая »
#0
22:43, 4 июля 2021

  Вобщем такая проблемка. Вывожу я значит конечное изображение с помощью OpenGL вот таким кодом

var
  texture_id: longint;
  buffer    : Windows.BITMAP;
  srf_bmp   : Graphics.TBitmap; // битмап, который нужно передать видеокарте для вывода на 
                                // компонент OpenGLControl1(Lazarus);
begin
  glEnable     (GL_TEXTURE_2D);
  glGenTextures(1,@texture_id);
  glBindTexture(GL_TEXTURE_2D,texture_id);
  GetObject    (srf_bmp.Handle,SizeOf(buffer),@buffer);
  glEnable(GL_TEXTURE_2D);
  glTexImage2D
  (
    GL_TEXTURE_2D,
    0,
    3,
    srf_bmp.Width,
    srf_bmp.Height,
    0,
    GL_RGBA,
    GL_UNSIGNED_BYTE,
    Buffer.bmBits
  );
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST{GL_LINEAR});
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST{GL_LINEAR});
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S    ,GL_CLAMP  {GL_REPEAT});
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T    ,GL_CLAMP  {GL_REPEAT});
  glBegin(GL_QUADS);
     glTexCoord2f( 0, 0  );
     glVertex3f  (-1, 1,0);
     glTexCoord2f( 1, 0  );
     glVertex3f  ( 1, 1,0);
     glTexCoord2f( 1, 1  );
     glVertex3f  ( 1,-1,0);
     glTexCoord2f( 0, 1  );
     glVertex3f  (-1,-1,0);
  glEnd;
  glDisable(GL_TEXTURE_2D);
  OpenGLControl1.SwapBuffers;
end;
  Все прекрасно рисуется, но только со свопнутыми красным и синим каналами. Есть какая нибудь переключалка в OpenGL для этого? У меня текстура-источник с форматом пикселя ABGR(Little Endian). Читал по этой теме немало, многие только освещают сам факт, но внятного решения так и не нашел.


#1
23:25, 4 июля 2021

В шейдере не?

Я так делаю:

+ Показать

#2
23:32, 4 июля 2021

GL_BGRA вместо GL_RGBA в формате попробуй.

#3
(Правка: 23:36) 23:36, 4 июля 2021

попробуй так

+ Показать

eDmk
> В шейдере не?
говорят что в OpenGL 1.1 их ещё не завезли

#4
23:36, 4 июля 2021

  Не, на шейдере врядли, так как в них я почти ноль). Где то еще попадалось упоминание про GL_UNPACK_SWAP_BYTES, только куда ее вставить ума не приложу.

#5
(Правка: 23:46) 23:39, 4 июля 2021

HolyDel

GL_BGRA вместо GL_RGBA в формате попробуй

  Эх, не нахожу что-то такой(GL_BGRA) константы, хоть убейте(.

skalogryz, оk, щас попробую.

#6
(Правка: 23:43) 23:42, 4 июля 2021

ArtProg
> Не, на шейдере врядли, так как в них я почти ноль)
тебе следует срочно начать их прокачивать.
OpenGL, к сожалению, вчерашний день. Не значние шейдеров - позавчерашний.
любая новая технология Vulkan или DX12 это тупо шейдеры.
Начни с OGL-ых, ибо тебе хоть что-то там понятно будет.

ну а чтобы OGL шейдеры+паскаль, то это не проблема в гугле найти.

#7
23:54, 4 июля 2021

ArtProg
> Эх, не нахожу что-то такой(GL_BGRA) константы, хоть убейте(.
32993 её значение. Попробуй его явно задать.

#8
(Правка: 23:59) 23:57, 4 июля 2021

glTexImage2D
  (
    GL_TEXTURE_2D,
    0,
    3,
    srf_bmp.Width,
    srf_bmp.Height,
    0,
    GL_RGBA,
    GL_UNSIGNED_BYTE,
    Buffer.bmBits
  );

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

#9
0:00, 5 июля 2021

skalogryz
> попробуй так
этому коду уже 2000 лет... почти ни чего не меняется. )))

> говорят что в OpenGL 1.1 их ещё не завезли
не факт, что там 1.1, а в 2.1 уже шейдеры были (с 1.5 вроде как, если не ошибаюсь).

> OpenGL, к сожалению, вчерашний день. Не значние шейдеров - позавчерашний.
все "устаревшие" функции в версиях OpenGL выше 3.3 точно в шейдеры переводятся автоматически. Так что тут без разницы на какой версии пишет. А вот как раз со старым OpenGL очень удобно разбираться в 3D. Для понимания хорошо подходит. А шейдеры нагнать всегда можно.

#10
(Правка: 0:09) 0:08, 5 июля 2021

ИПавлов
> GL_RGBA,

ArtProg
> ABGR
нормально? Ему всё надо развернуть.
Код, предоставленный Скалогрызом может не сработать.

В цикле надо все данные разворачивать, наверно так:

for i := 0 to buffer.bmWidth * buffer.bmHeight - 1 do 
begin
    t1 := pix^[j];
    t2 := pix^[j+1]
    pix^[j] := pix^[j+3];
    pix^[j+1] := pix^[j+2];
    pix^[j+2] := t2;
    pix^[j+3] := t1;
    inc(j, c);
end;
хотя тоже может не сработать...

#11
0:21, 5 июля 2021

конечно нормально. я указал на этот самый переключатель. а переключать или не переключать переключатель выбор остаётся за тобой.

#12
0:28, 5 июля 2021

ИПавлов, нет там ни чего для переключения в ABGR!!!
Если предоставлять какую-то информацию, то наверно смотреть надо, есть то что ищут или нет?!

#13
0:35, 5 июля 2021

HolyDel
  Даже не знаю как отблагодарить)). Теперь все работает как надо. Всем спасибо за помощь!

#14
0:41, 5 июля 2021

а он разве говорил что проблема с альфа каналом? опенгл по дефолту читает аргб. хоть и написано ргба.
а сообщений номер 3 и 5 в этой теме тоже небыло?
мне не важно что ему там поможет или не поможет.. переключатель есть. а как он будет им пользоваться это его дело. поможет понимание.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика