Я сделал эффект следа частиц в OpenGL.
Хитрость заключается в том, чтобы нарисовать полупрозрачный прямоугольник на экране, чтобы постепенно исчезать предыдущий кадр:
ofSetColor(0,0,0,255*(1.0-persistence));
ofFill();
ofRect(0, 0, ofGetScreenWidth(), ofGetScreenHeight());
а затем нарисуйте частицы (примерно):
ofEnableBlendMode(OF_BLENDMODE_ADD);
ofEnablePointSprites();
vbo.draw(GL_POINTS, 0, (int)points.size());
ofDisablePointSprites();
Проблема в том, что трассы не исчезают, пока не станут чисто черными, но остаются сероватыми.
Я мог бы портировать темно-серые значения или постепенно их затухать, но как лучше это сделать? Функции / операции смешивания OpenGL или шейдер? Скорость — главная проблема.
Вам нужно выделить свой FBO в формате с плавающей запятой.
В каталоге примеров openFrameworks есть пример, который показывает разницу между форматами с плавающей запятой и без форматов с плавающей запятой, и это кажется вашей проблемой (examples/gl/fboTrailsExample
).
Распределение в формате с плавающей запятой:
ofFbo rgbaFboFloat;
rgbaFboFloat.allocate(400, 400, GL_RGBA32F_ARB);
а затем в методе обновления вы можете нарисовать в FBO между rgbaFboFloat.begin();
а также rgbaFboFloat.end();
Чтобы закончить, вы рисуете свою FBO в методе draw: rgbaFboFLoat.draw(0,0);