Проблема рендеринга в текстуру с альфа-версией

StackOverflow https://stackoverflow.com/questions/1295657

Вопрос

Когда я визуализирую текстуру, а затем рисую то же изображение, кажется, что все становится темнее.Чтобы получить это изображение:

http://img24.imageshack.us/img24/8061/87993367.png

Я рисую верхний левый квадрат цветом. (1, 1, 1, .8) в текстуру, затем визуализируем эту текстуру плюс средний квадрат (того же цвета) в другую текстуру, а затем, наконец, эту текстуру плюс правый нижний квадрат (того же цвета) на экран.

Как видите, каждый раз, когда я визуализирую текстуру, все становится немного темнее.

Мой код рендеринга в текстуру выглядит так:(Я использую OpenGL ES на iPhone)

// gen framebuffer
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

// gen texture
GLuint texture;
glGenTextures(1, &texture);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);

// hook it up
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES))
   return false;

// set up drawing
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glViewport(0, 0, Screen::Width, Screen::Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Screen::Width, 0, Screen::Height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4f(1, 1, 1, 1);

// do whatever drawing we'll do here
Draw();

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

Есть ли что-то, что я делаю здесь неправильно?Вам нужно больше кода, чтобы понять это?Что здесь может происходить?

Это было полезно?

Решение

Я только предполагаю:

Рисование первой текстуры дает вам 204 (0,8 * 255) в каналах RGB и альфа.Когда вы рисуете во второй раз (я полагаю, с включенным GL_BLEND), вы получаете светло-серый 204 RGB с 80% альфа, что дает вам средний серый цвет.

Решение:использовать glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) и предварительно умножьте ваши цвета.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top