【发布时间】:2016-06-28 21:22:37
【问题描述】:
在使用 SDL 开发粒子引擎时,我偶然发现了以下问题:
在按照here(第 6 步:优化,我基本上将最后一帧的 alpha 为 254 的帧绘制到当前帧)实现帧插值技术后,它会淡出),我注意到一些像素本来应该从白色逐渐褪色到黑色,最终保持灰色,精确的 rgba 值为 112。在做了一些数学运算后,我发现了造成这种情况的原因:每一帧我都将最后一帧的 rgba 值乘以 254/255,这在 112 之前都可以正常工作。
然后有趣的事情发生了。当您执行以下操作时:round(112/255*254)=112,值将保持不变(我将数字四舍五入,因为最终值将存储为像素的 8 位颜色值),这意味着我使用 alpha 的褪色技术不再起作用了。 问题是我希望这些保持在 112 的灰色像素进一步淡出。问题是,我如何在 SDL 中实现这样的目标?
我知道我可以降低 254 的值,这样这种最小值就会减小,但我希望我的粒子能够非常温和地淡出(我正在制作一个 60fps 的游戏)。我也考虑过自己创建一个 OpenGL 图形引擎(这样我就可以使用浮点纹理,在这种情况下我需要的精度),但我在 OpenGL 方面做得不够好,也没有时间去做一个东西。 我需要使用纹理进行存储的原因是我想让粒子发出轨迹(就好像你停止清除帧缓冲区并移动了一个对象,但不是屏幕变得一团糟,而是旧像素会淡出)
currentFrame->renderTo();//Draw to the current frame rendertarget
graphics.clear(Color(0,0,0,0)); //Clear the screen using the given color
graphics.scale=1.0f; //Manipulate pixel size (for visible pixel art)
SDL_SetTextureBlendMode(lastFrame->texture, SDL_BLENDMODE_NONE);
//Set blendmode to opaque
graphics.drawTexture(lastFrame,graphics.camera.position,Color(255,255,255,254));
//Draw the last frame
SDL_SetTextureBlendMode(lastFrame->texture, SDL_BLENDMODE_BLEND);
//Revert blendmode to alpha blending
【问题讨论】:
标签: c++ graphics sdl alphablending