2011-01-18 2 views
3

Я читаю пиксельные данные из буфера кадров, и все, кажется, работает, для альфа-значение, которое всегда 1,0glReadPixels и альфа-каналы возвращаются 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) получить текстуру в клиентскую память, из фреймбуфера?

редактировать: это как очистить буфер:

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

Вы пытались glReadPixels с другим форматом, таким как GL_UNSIGNED_BYTE, вместо GL_FLOAT? На всякий случай это ошибка драйвера? – rotoglup

+0

Вы пытались удалить весь рендеринг и сохранить только glClear и glReadPixels? Является ли поведение одинаковым в этом случае? – rotoglup

+0

Да, я удалил чертежи и только пробовал предмет glCLear, это все еще черный, непрозрачный снимок. Я постараюсь с GL_UNSIGNED_BYTE скоро – kamziro

ответ

6

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

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

После проверки с помощью gDEBugger значение GL_COLOR_CLEAR_VALUE равно 0,0,0,0, GL_ALPHA_BITS равно 8, а GL_COLOR_WRITEMASK - это n/a, но я сделал glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE). – kamziro

+0

Попробуйте очистить с помощью 'glClearColor (0,0,0,0,5) 'и убедитесь, что вы извлекаете 0,5 из буфера кадров. – tibur

+0

GL_BLEND_DST_ALPHA - ноль, но это GL_BLEND_DST_RGB и GL_BLEND_DST – kamziro

1

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

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

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

0

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

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL); 
Смежные вопросы