OpenGL добавляет режим наложения на кадровый буфер

Рендеринг отличается, если я отрисовываю свою сцену прямо на экране, и если я рендеринг на FBO (объект кадрового буфера), я подозреваю, что режим добавления наложения не работает в последнем случае:

Вот результат прямо на экране:

Рендеринг прямо на экране

Вот результат с кадровым буфером:

введите описание изображения здесь

Как видите, в буфере кадров синий цвет не суммируется, чтобы стать ярким.

Для рисования на экране я просто вызываю функцию рисования частиц:

 drawParticles();

А для FBO (с ofFbo от openframeworks):

 ofClear(0, 0, 0, 0);

fbo.begin();
drawParticles();
fbo.end();

fbo.draw(0,0);

—- РЕДАКТИРОВАТЬ —-

Вот как инициализируется fbo:

fbo.allocate(ofGetScreenWidth(), ofGetScreenHeight(), GL_RGBA32F_ARB);

Вот весь мой код, для рисования на экране я использую эту версию, а для рисования на fbo я раскомментирую комментарии:

//            ofClear(0, 0, 0, 0);
//            bodyFBO.begin();

if(persistence>0)
{
ofSetColor(0,0,0,255*(1.0-persistence));
ofFill();
ofRect(0, 0, ofGetScreenWidth(), ofGetScreenHeight());
}
else
ofBackground(0, 0, 0);

effects[effect]->draw();
//            bodyFBO.end();

ofEnableAlphaBlending();
//            bodyFBO.draw(0,0);

А вот фактический рисунок, в эффектах [effect] -> draw ():

ofSetColor(color);

ofEnableBlendMode(OF_BLENDMODE_ADD);

ofEnablePointSprites();

ofTexture &texture = textureIndex>0?texture2:texture1;
texture.bind();

vbo.draw(GL_POINTS, 0, (int)points.size());

texture.unbind();

ofDisablePointSprites();

—- РЕДАКТИРОВАТЬ 2 —-

Еще один фрагмент кода, показывающий ту же проблему (автор mikewesthad с форума openframeworks):

void testApp::setup(){
ofSetFrameRate(60);
ofSetBackgroundAuto(false);
ofBackground(0);

fbo.allocate(ofGetWidth()/2, ofGetHeight(), GL_RGBA32F);
fbo.begin();
ofBackground(0);
fbo.end();
}

void testApp::draw(){
// Draw directly to screen
drawCircle();

// Draw to fbo
fbo.begin();
drawCircle();
fbo.end();
ofDisableBlendMode();
fbo.draw(ofGetWidth()/2, 0);
}

void testApp::drawCircle() {
ofEnableAlphaBlending();
ofSetColor(0, 0, 0, 2);
ofFill();
ofRect(0, 0, ofGetScreenWidth(), ofGetScreenHeight());
ofSetColor(50, 50, 255, 255);
ofEnableBlendMode(OF_BLENDMODE_ADD);
ofCircle(ofRandomWidth()/2, ofRandomHeight(), 50);

добавить проблему смешивания на fbo

—- Ответ —-

Там пропал ofSetColor(255,255,255); перед рисованием FBO.

Чтобы иметь то же самое на экране и на FBO, мне также нужно было распределить FBO с помощью GL_RGB (с параметрами по умолчанию в openframeworks):

fbo.allocate(ofGetWidth()/2, ofGetHeight(), GL_RGB);

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector