在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
最佳答案
我将使用一个名为“ decay”的全局浮点变量来存储非四舍五入的alpha值。
float decay = 255.0;
[...]
decay = decay / 255.0 * 254.0;
Uint8 alpha = round(decay);
如果每个像素需要一个“衰减”值,则可以为粒子声明一个结构:
typedef struct {
int active;
float x,y;
float dx,dy; // directions for x and y
float decay;
Uint8 r,g,b,a; // colour
} s_dots;
s_dots dots[MAX_NUMBER_OF_DOTS];