glReadPixels и альфа-каналы, возвращающие 1.0 - PullRequest
3 голосов
/ 18 января 2011

Я читаю данные пикселей из кадрового буфера, и все, кажется, работает, за исключением значения альфа, которое всегда равно 1,0

  GLfloat lebuf[areasize * 4];
  glReadPixels(xstart, ystart, partw, parth, GL_RGBA, GL_FLOAT, lebuf);

Я установил код создания окна для поддержки альфа-канала:

  SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8);

Есть ли какое-то другое место, на которое я должен обратить внимание, чтобы проверить, почему альфа-канал все время равен 1.0? Еще лучше, есть ли другой способ (кроме glReadPixels) получить текстуру в память клиента из кадрового буфера?

edit : вот как я очищаю буфер:

 glClearColor(0,0,0,0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Ответы [ 3 ]

6 голосов
/ 18 января 2011

Не могли бы вы проверить:

  • То, что вы SDL приняли ваш формат (glGetIntegerv(GL_ALPHA_BITS, bits))?
  • Что ваш цвет прозрачности не равен 1 (glClearColor).Что делать, если очистить до 0,5 и получить буфер перед рендерингом.Получаете ли вы 0,5?
  • что ваш альфа-буфер не заблокирован от записи (glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE))?
  • что вы правильно очищаете альфа-буфер в конце каждого кадра?
  • Что ваша функция смешивания будет записывать правильное альфа-значение в буфер?
3 голосов
/ 15 января 2013

Если вы используете GLUT, помните, что вы должны установить главное окно следующим образом:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL);

В противном случае glReadPixels будет всегда читать альфа-канал = 1.

0 голосов
/ 24 апреля 2014

Пожалуйста, используйте следующую строку .. проблема будет решена.

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL);
...