如何在OpenGL / GLSL中阈值特定颜色

时间:2014-07-20 11:54:36

标签: c++ opengl glsl openframeworks blending

我在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();

Particle trails effect

问题是这些小径在变成纯黑色之前不会褪色,但仍然是灰色的。

我可以对暗灰色值进行阈值处理,或逐渐淡化它们,但是最好的方法是什么? OpenGL混合功能/操作或着色器?速度是一个主要问题。

1 个答案:

答案 0 :(得分:1)

您需要使用浮点格式分配fbo。

openFrameworks示例目录中有一个示例,它显示了浮点和非浮点格式之间的区别,这似乎是您的问题(examples/gl/fboTrailsExample)。

使用浮点格式进行分配:

ofFbo rgbaFboFloat;
rgbaFboFloat.allocate(400, 400, GL_RGBA32F_ARB);

然后在更新方法中,您可以在rgbaFboFloat.begin();rgbaFboFloat.end();之间绘制fbo

要完成,您可以使用绘制方法绘制fbo:rgbaFboFLoat.draw(0,0);