Рендеринг отличается, если я отрисовываю свою сцену прямо на экране, и если я рендеринг на 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);
—- Ответ —-
Там пропал ofSetColor(255,255,255);
перед рисованием FBO.
Чтобы иметь то же самое на экране и на FBO, мне также нужно было распределить FBO с помощью GL_RGB (с параметрами по умолчанию в openframeworks):
fbo.allocate(ofGetWidth()/2, ofGetHeight(), GL_RGB);
Задача ещё не решена.
Других решений пока нет …