【发布时间】:2014-07-20 11:54:35
【问题描述】:
我在 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混合功能/操作或着色器?速度是一个主要问题。
【问题讨论】:
-
您使用的是什么混合模式?如果您使用默认值,则可以尝试乘法或减法混合。
-
我想你的意思是当我绘制透明矩形时。你能解释一下为什么你建议使用不同的混合模式吗?它会改变什么?我不记得 blendMode 是如何影响最终片段的。
-
我怀疑这是舍入错误,例如片段颜色变得像 0.01 一样小,乘以你的淡入淡出(比如 0.9)得到 0.09。但是当它被存储回一个字节时(使用常规的 RGBA8 帧缓冲区),它可能会被四舍五入到 0.01。 (实际值不正确;仅用于说明。)实际上乘法混合无济于事,但减法而不是乘法可能会奏效。 (当然要减去一些非黑色的东西:))
标签: c++ opengl glsl openframeworks blending