DIB рисует перекрывающиеся круги с альфа-смешением - PullRequest
1 голос
/ 30 марта 2020

Это будет мой первый вопрос здесь, я пытался просмотреть список предложений, но не смог найти тот, который соответствует моему вопросу. Таким образом, здесь мы go.

Я пытаюсь воспроизвести эффект, который я видел, я не знаю, будет ли способ, которым я это делаю, правильным подходом. Так что если у вас есть какие-либо предложения относительно того, как мне поступить, я с удовольствием оценил бы вклад. (Я буду заниматься только программным рендерингом)

(Это было сделано с помощью сглаживания)

Требуемый результат

Как так, я в настоящее время далеко от того места, где я хочу оказаться. Но я не новичок в кодировании как таковом, просто я не занимался такой графикой так долго.

Итак, мой способ делать вещи - сначала рисовать некоторые круги с альфа-смешиванием. Позже я думал о достижении эффекта свечения, двигаясь к белому, дальше по кругу I go, почти так же, как я делаю здесь с альфой.

Код следует.

// 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);
            }
        }
    }
}

Я рисую круг и использую радиус в качестве измерения альфа. Результат, однако, не тот, который я ожидал (желтый кружок показывает, как он выглядит без наложения;

Мой результат

Как вы можете видеть, цвета смешиваются вместе и создайте * solid красный без альфа-смешения по краям.

Понятия не имею почему, а? Спасибо.

РЕДАКТИРОВАТЬ: я исправил это, формат пикселя назначения был не ABGR, а ARGB, как сказал макрос, я также переключил его с sourcepixel. Я, наверное, слишком устал прошлой ночью.

...