DIB使用Alpha混合绘制重叠的圆

时间:2020-03-30 03:48:27

标签: alpha overlapping blending dib

这是我这里的第一个问题,我试图浏览建议列表,但找不到与我的问题匹配的建议。因此,我们开始吧。

我正在尝试复制自己看到的效果,我不知道我的操作方式是否正确。因此,如果您对我应该如何进行有任何建议,我将很高兴收到您的建议。 (我只会做软件渲染)

(这是使用抖动完成的)

Wanted result

就目前而言,我离我想要结束的地方很远。但是我对编码本身并不陌生,只是我一直没有做这种图形很久了。

因此,我的处理方式最初是使用alpha混合绘制一些圆圈。后来,我想通过在白色圆圈中越靠近白色逐渐达到发光效果,几乎与我在Alpha上做的方式一样。

代码紧随其后。

// Using mid-point algorithm
void DrawCircle(MEMORY *pMem, uint32 nX, uint32 nY, uint32 nColor)
{
    int32 
        nRadius = 50, rSquared = nRadius * nRadius;

    RECT rcCircle =
    {
        -nRadius, -nRadius, nRadius, nRadius
    };

    for (int32 cY = rcCircle.top; cY < rcCircle.bottom; cY++)
    {
        int32 cYSquared = cY * cY;
        for (int32 cX = rcCircle.left; cX < rcCircle.right; cX++)
        {
            int32
                cXSquared = cX * cX,
                nResult = (cXSquared + cYSquared) - rSquared;

            // Check to see if we're inside the circle
            if (nResult < 0)
            {
                uint32 *pPixelDest = &pMem->Canvas.pBmpMem[(cX + nX) + (cY + nY) * pMem->Canvas.nWidth];

                float
                    dist = fabs(sqrt(cXSquared + cYSquared) - nRadius), // Calculate distance from point to center of the circle
                    A = (dist / nRadius),                               // Base alpha on the distance from circle center to the point (circle fading out)

                    SR = (float)((nColor >> 0) & 0xFF),
                    SG = (float)((nColor >> 8) & 0xFF),
                    SB = (float)((nColor >> 16) & 0xFF),

                    DR = (float)((*pPixelDest >> 0) & 0xFF),
                    DG = (float)((*pPixelDest >> 8) & 0xFF),
                    DB = (float)((*pPixelDest >> 16) & 0xFF),

                    R = (1.0f - A) * DR + A * SR,
                    G = (1.0f - A) * DG + A * SG,
                    B = (1.0f - A) * DB + A * SB;

                    *pPixelDest = ARGB((uint32)A, (uint32)R, (uint32)G, (uint32)B);
            }
        }
    }
}

我正在绘制一个圆,并且使用半径作为Alpha的度量。 结果虽然不是我所期望的(黄色圆圈显示了它的外观而没有重叠;

My result

如您所见,这些颜色混合在一起并创建了非常纯净的红色,边缘周围没有alpha混合。

我不知道为什么,你呢? 谢谢。

编辑:我修复了它,目标像素格式不是ABGR而是宏,正如宏所说,它是ARGB,我也将其从源像素切换了过来。昨晚我可能太累了。

0 个答案:

没有答案
相关问题