【问题标题】:SDL blending causing incorrect frame interpolationSDL 混合导致不正确的帧插值
【发布时间】: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


    【解决方案1】:

    我会使用一个名为“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];
    

    【讨论】:

    • 这确实是我正在寻找的那种解决方案,但问题是每个像素都有它自己的(衰减的)alpha 值(例如,当前帧的新绘制的像素有一个alpha 值为 255,而旧帧褪色),这意味着单个 alpha 值是不够的。
    • 按像素我实际上指的是属于缓冲区的像素,而不是粒子对象(为了清楚起见,我已经更新了问题)。问题是这种技术需要我为每个粒子维护许多结构(其中大约有 40 个当时可能存在)。我不能接受这是一个解决方案,但我非常感谢您努力帮助我。
    猜你喜欢
    • 2018-03-25
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多