C++ Motion Blur

axcord.ws
Забаненный
Статус
Оффлайн
Регистрация
8 Апр 2021
Сообщения
178
Реакции[?]
30
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
struct MotionBlurHistory
{
    MotionBlurHistory() noexcept
    {
        lastTimeUpdate = 0.0f;
        previousPitch = 0.0f;
        previousYaw = 0.0f;
        previousPositon = Vector{ 0.0f, 0.0f, 0.0f };
        noRotationalMotionBlurUntil = 0.0f;
    }

    float lastTimeUpdate;
    float previousPitch;
    float previousYaw;
    Vector previousPositon;
    float noRotationalMotionBlurUntil;
};

void Visuals::motionBlur(ViewSetup* setup) noexcept
{
    if (!localPlayer || !config->visuals.motionBlur.enabled)
        return;

    static MotionBlurHistory history;
    static float motionBlurValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
    if (setup)
    {
        const float timeElapsed = memory->globalVars->realtime - history.lastTimeUpdate;

        const auto viewangles = setup->angles;

        const float currentPitch = Helpers::normalizeYaw(viewangles.x);
        const float currentYaw = Helpers::normalizeYaw(viewangles.y);

        Vector currentSideVector;
        Vector currentForwardVector;
        Vector currentUpVector;
        Vector::fromAngleAll(setup->angles, &currentForwardVector, &currentSideVector, &currentUpVector);

        Vector currentPosition = setup->origin;
        Vector positionChange = history.previousPositon - currentPosition;

        if ((positionChange.length() > 30.0f) && (timeElapsed >= 0.5f))
        {
            motionBlurValues[0] = 0.0f;
            motionBlurValues[1] = 0.0f;
            motionBlurValues[2] = 0.0f;
            motionBlurValues[3] = 0.0f;
        }
        else if (timeElapsed > (1.0f / 15.0f))
        {
            motionBlurValues[0] = 0.0f;
            motionBlurValues[1] = 0.0f;
            motionBlurValues[2] = 0.0f;
            motionBlurValues[3] = 0.0f;
        }
        else if (positionChange.length() > 50.0f)
        {
            history.noRotationalMotionBlurUntil = memory->globalVars->realtime + 1.0f;
        }
        else
        {
            const float horizontalFov = setup->fov;
            const float verticalFov = (setup->aspectRatio <= 0.0f) ? (setup->fov) : (setup->fov / setup->aspectRatio);
            const float viewdotMotion = currentForwardVector.dotProduct(positionChange);

            if (config->visuals.motionBlur.forwardEnabled)
                motionBlurValues[2] = viewdotMotion;

            const float sidedotMotion = currentSideVector.dotProduct(positionChange);
            float yawdiffOriginal = history.previousYaw - currentYaw;
            if (((history.previousYaw - currentYaw > 180.0f) || (history.previousYaw - currentYaw < -180.0f)) &&
                ((history.previousYaw + currentYaw > -180.0f) && (history.previousYaw + currentYaw < 180.0f)))
                yawdiffOriginal = history.previousYaw + currentYaw;

            float yawdiffAdjusted = yawdiffOriginal + (sidedotMotion / 3.0f);

            if (yawdiffOriginal < 0.0f)
                yawdiffAdjusted = std::clamp(yawdiffAdjusted, yawdiffOriginal, 0.0f);
            else
                yawdiffAdjusted = std::clamp(yawdiffAdjusted, 0.0f, yawdiffOriginal);

            const float undampenedYaw = yawdiffAdjusted / horizontalFov;
            motionBlurValues[0] = undampenedYaw * (1.0f - (fabsf(currentPitch) / 90.0f));

            const float pitchCompensateMask = 1.0f - ((1.0f - fabsf(currentForwardVector[2])) * (1.0f - fabsf(currentForwardVector[2])));
            const float pitchdiffOriginal = history.previousPitch - currentPitch;
            float pitchdiffAdjusted = pitchdiffOriginal;

            if (currentPitch > 0.0f)
                pitchdiffAdjusted = pitchdiffOriginal - ((viewdotMotion / 2.0f) * pitchCompensateMask);
            else
                pitchdiffAdjusted = pitchdiffOriginal + ((viewdotMotion / 2.0f) * pitchCompensateMask);


            if (pitchdiffOriginal < 0.0f)
                pitchdiffAdjusted = std::clamp(pitchdiffAdjusted, pitchdiffOriginal, 0.0f);
            else
                pitchdiffAdjusted = std::clamp(pitchdiffAdjusted, 0.0f, pitchdiffOriginal);

            motionBlurValues[1] = pitchdiffAdjusted / verticalFov;
            motionBlurValues[3] = undampenedYaw;
            motionBlurValues[3] *= (fabs(currentPitch) / 90.0f) * (fabs(currentPitch) / 90.0f) * (fabs(currentPitch) / 90.0f);

            if (timeElapsed > 0.0f)
                motionBlurValues[2] /= timeElapsed * 30.0f;
            else
                motionBlurValues[2] = 0.0f;

            motionBlurValues[2] = std::clamp((fabsf(motionBlurValues[2]) - config->visuals.motionBlur.fallingMin) / (config->visuals.motionBlur.fallingMax - config->visuals.motionBlur.fallingMin), 0.0f, 1.0f) * (motionBlurValues[2] >= 0.0f ? 1.0f : -1.0f);
            motionBlurValues[2] /= 30.0f;
            motionBlurValues[0] *= config->visuals.motionBlur.rotationIntensity * .15f * config->visuals.motionBlur.strength;
            motionBlurValues[1] *= config->visuals.motionBlur.rotationIntensity * .15f * config->visuals.motionBlur.strength;
            motionBlurValues[2] *= config->visuals.motionBlur.rotationIntensity * .15f * config->visuals.motionBlur.strength;
            motionBlurValues[3] *= config->visuals.motionBlur.fallingIntensity * .15f * config->visuals.motionBlur.strength;

        }

        if (memory->globalVars->realtime < history.noRotationalMotionBlurUntil)
        {
            motionBlurValues[0] = 0.0f;
            motionBlurValues[1] = 0.0f;
            motionBlurValues[3] = 0.0f;
        }
        else
        {
            history.noRotationalMotionBlurUntil = 0.0f;
        }
        history.previousPositon = currentPosition;

        history.previousPitch = currentPitch;
        history.previousYaw = currentYaw;
        history.lastTimeUpdate = memory->globalVars->realtime;
        return;
    }

    const auto material = interfaces->materialSystem->findMaterial("dev/motion_blur", "RenderTargets", false);
    if (!material)
        return;

    const auto MotionBlurInternal = material->findVar("$MotionBlurInternal", nullptr, false);

    MotionBlurInternal->setVecComponentValue(motionBlurValues[0], 0);
    MotionBlurInternal->setVecComponentValue(motionBlurValues[1], 1);
    MotionBlurInternal->setVecComponentValue(motionBlurValues[2], 2);
    MotionBlurInternal->setVecComponentValue(motionBlurValues[3], 3);

    const auto MotionBlurViewPortInternal = material->findVar("$MotionBlurViewportInternal", nullptr, false);

    MotionBlurViewPortInternal->setVecComponentValue(0.0f, 0);
    MotionBlurViewPortInternal->setVecComponentValue(0.0f, 1);
    MotionBlurViewPortInternal->setVecComponentValue(1.0f, 2);
    MotionBlurViewPortInternal->setVecComponentValue(1.0f, 3);

    DRAW_SCREEN_EFFECT(material)
}
 
Забаненный
Статус
Оффлайн
Регистрация
27 Ноя 2022
Сообщения
77
Реакции[?]
26
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пользователь
Статус
Оффлайн
Регистрация
20 Мар 2020
Сообщения
166
Реакции[?]
41
Поинты[?]
0
C++:
struct MotionBlurHistory
{
    MotionBlurHistory() noexcept
    {
        lastTimeUpdate = 0.0f;
        previousPitch = 0.0f;
        previousYaw = 0.0f;
        previousPositon = Vector{ 0.0f, 0.0f, 0.0f };
        noRotationalMotionBlurUntil = 0.0f;
    }

    float lastTimeUpdate;
    float previousPitch;
    float previousYaw;
    Vector previousPositon;
    float noRotationalMotionBlurUntil;
};

void Visuals::motionBlur(ViewSetup* setup) noexcept
{
    if (!localPlayer || !config->visuals.motionBlur.enabled)
        return;

    static MotionBlurHistory history;
    static float motionBlurValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
    if (setup)
    {
        const float timeElapsed = memory->globalVars->realtime - history.lastTimeUpdate;

        const auto viewangles = setup->angles;

        const float currentPitch = Helpers::normalizeYaw(viewangles.x);
        const float currentYaw = Helpers::normalizeYaw(viewangles.y);

        Vector currentSideVector;
        Vector currentForwardVector;
        Vector currentUpVector;
        Vector::fromAngleAll(setup->angles, &currentForwardVector, &currentSideVector, &currentUpVector);

        Vector currentPosition = setup->origin;
        Vector positionChange = history.previousPositon - currentPosition;

        if ((positionChange.length() > 30.0f) && (timeElapsed >= 0.5f))
        {
            motionBlurValues[0] = 0.0f;
            motionBlurValues[1] = 0.0f;
            motionBlurValues[2] = 0.0f;
            motionBlurValues[3] = 0.0f;
        }
        else if (timeElapsed > (1.0f / 15.0f))
        {
            motionBlurValues[0] = 0.0f;
            motionBlurValues[1] = 0.0f;
            motionBlurValues[2] = 0.0f;
            motionBlurValues[3] = 0.0f;
        }
        else if (positionChange.length() > 50.0f)
        {
            history.noRotationalMotionBlurUntil = memory->globalVars->realtime + 1.0f;
        }
        else
        {
            const float horizontalFov = setup->fov;
            const float verticalFov = (setup->aspectRatio <= 0.0f) ? (setup->fov) : (setup->fov / setup->aspectRatio);
            const float viewdotMotion = currentForwardVector.dotProduct(positionChange);

            if (config->visuals.motionBlur.forwardEnabled)
                motionBlurValues[2] = viewdotMotion;

            const float sidedotMotion = currentSideVector.dotProduct(positionChange);
            float yawdiffOriginal = history.previousYaw - currentYaw;
            if (((history.previousYaw - currentYaw > 180.0f) || (history.previousYaw - currentYaw < -180.0f)) &&
                ((history.previousYaw + currentYaw > -180.0f) && (history.previousYaw + currentYaw < 180.0f)))
                yawdiffOriginal = history.previousYaw + currentYaw;

            float yawdiffAdjusted = yawdiffOriginal + (sidedotMotion / 3.0f);

            if (yawdiffOriginal < 0.0f)
                yawdiffAdjusted = std::clamp(yawdiffAdjusted, yawdiffOriginal, 0.0f);
            else
                yawdiffAdjusted = std::clamp(yawdiffAdjusted, 0.0f, yawdiffOriginal);

            const float undampenedYaw = yawdiffAdjusted / horizontalFov;
            motionBlurValues[0] = undampenedYaw * (1.0f - (fabsf(currentPitch) / 90.0f));

            const float pitchCompensateMask = 1.0f - ((1.0f - fabsf(currentForwardVector[2])) * (1.0f - fabsf(currentForwardVector[2])));
            const float pitchdiffOriginal = history.previousPitch - currentPitch;
            float pitchdiffAdjusted = pitchdiffOriginal;

            if (currentPitch > 0.0f)
                pitchdiffAdjusted = pitchdiffOriginal - ((viewdotMotion / 2.0f) * pitchCompensateMask);
            else
                pitchdiffAdjusted = pitchdiffOriginal + ((viewdotMotion / 2.0f) * pitchCompensateMask);


            if (pitchdiffOriginal < 0.0f)
                pitchdiffAdjusted = std::clamp(pitchdiffAdjusted, pitchdiffOriginal, 0.0f);
            else
                pitchdiffAdjusted = std::clamp(pitchdiffAdjusted, 0.0f, pitchdiffOriginal);

            motionBlurValues[1] = pitchdiffAdjusted / verticalFov;
            motionBlurValues[3] = undampenedYaw;
            motionBlurValues[3] *= (fabs(currentPitch) / 90.0f) * (fabs(currentPitch) / 90.0f) * (fabs(currentPitch) / 90.0f);

            if (timeElapsed > 0.0f)
                motionBlurValues[2] /= timeElapsed * 30.0f;
            else
                motionBlurValues[2] = 0.0f;

            motionBlurValues[2] = std::clamp((fabsf(motionBlurValues[2]) - config->visuals.motionBlur.fallingMin) / (config->visuals.motionBlur.fallingMax - config->visuals.motionBlur.fallingMin), 0.0f, 1.0f) * (motionBlurValues[2] >= 0.0f ? 1.0f : -1.0f);
            motionBlurValues[2] /= 30.0f;
            motionBlurValues[0] *= config->visuals.motionBlur.rotationIntensity * .15f * config->visuals.motionBlur.strength;
            motionBlurValues[1] *= config->visuals.motionBlur.rotationIntensity * .15f * config->visuals.motionBlur.strength;
            motionBlurValues[2] *= config->visuals.motionBlur.rotationIntensity * .15f * config->visuals.motionBlur.strength;
            motionBlurValues[3] *= config->visuals.motionBlur.fallingIntensity * .15f * config->visuals.motionBlur.strength;

        }

        if (memory->globalVars->realtime < history.noRotationalMotionBlurUntil)
        {
            motionBlurValues[0] = 0.0f;
            motionBlurValues[1] = 0.0f;
            motionBlurValues[3] = 0.0f;
        }
        else
        {
            history.noRotationalMotionBlurUntil = 0.0f;
        }
        history.previousPositon = currentPosition;

        history.previousPitch = currentPitch;
        history.previousYaw = currentYaw;
        history.lastTimeUpdate = memory->globalVars->realtime;
        return;
    }

    const auto material = interfaces->materialSystem->findMaterial("dev/motion_blur", "RenderTargets", false);
    if (!material)
        return;

    const auto MotionBlurInternal = material->findVar("$MotionBlurInternal", nullptr, false);

    MotionBlurInternal->setVecComponentValue(motionBlurValues[0], 0);
    MotionBlurInternal->setVecComponentValue(motionBlurValues[1], 1);
    MotionBlurInternal->setVecComponentValue(motionBlurValues[2], 2);
    MotionBlurInternal->setVecComponentValue(motionBlurValues[3], 3);

    const auto MotionBlurViewPortInternal = material->findVar("$MotionBlurViewportInternal", nullptr, false);

    MotionBlurViewPortInternal->setVecComponentValue(0.0f, 0);
    MotionBlurViewPortInternal->setVecComponentValue(0.0f, 1);
    MotionBlurViewPortInternal->setVecComponentValue(1.0f, 2);
    MotionBlurViewPortInternal->setVecComponentValue(1.0f, 3);

    DRAW_SCREEN_EFFECT(material)
}
Зачем выкладывать паблик?
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
696
Реакции[?]
540
Поинты[?]
153K
ну это паблик + кривой метод, ждите баги пропадания оружек и прочее говно.

@ валв удаляют моушин ибо он криво работает на амд
@ пастеры - ООО МОУШИН ИЗ СУРСОВ КС ! НАДО БРАТЬ!
 
Участник
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
617
Реакции[?]
182
Поинты[?]
12K
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
696
Реакции[?]
540
Поинты[?]
153K
Только на амд


Так а че б нвидиа юзерам не юзать то...
А ещё фикс есть
Ну в треде фикса нет поэтому говорю что говно, а если тут пастерки которые п2с делают, они че будут писать типа не включайте на амд?
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,380
Реакции[?]
2,284
Поинты[?]
189K
они че будут писать типа не включайте на амд?
Почему бы и нет? Помнится был один чит (вроде от Абдулова), где на процессорах от амд меню очень некорректно рендерилось.
Они так и писали: поддержка онли intel :roflanzdarova:
 
Тьомчик
Участник
Статус
Оффлайн
Регистрация
30 Июн 2020
Сообщения
725
Реакции[?]
150
Поинты[?]
58K
Ну во первых это паблик уже полтора года.
А во вторых есть фикс тоже паблик, ищете сами, а я дальше пить 🥴
 
Забаненный
Статус
Оффлайн
Регистрация
27 Ноя 2022
Сообщения
77
Реакции[?]
26
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему бы и нет? Помнится был один чит (вроде от Абдулова), где на процессорах от амд меню очень некорректно рендерилось.
Они так и писали: поддержка онли intel :roflanzdarova:
а каким боком процессор к рендеру относится)
 
ЧВК EB_LAN
Эксперт
Статус
Онлайн
Регистрация
26 Янв 2021
Сообщения
1,552
Реакции[?]
519
Поинты[?]
189K
а каким боком процессор к рендеру относится)
а каким боком этот блюр к видяхе относится если играть в большинстве случаев нагружает онли проц (у меня видяха 11 процентов всего загружена а проц на 90 и у меня 270-310 фпс)
 
Забаненный
Статус
Оффлайн
Регистрация
27 Ноя 2022
Сообщения
77
Реакции[?]
26
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а каким боком этот блюр к видяхе относится если играть в большинстве случаев нагружает онли проц (у меня видяха 11 процентов всего загружена а проц на 90 и у меня 270-310 фпс)
А НУ НЕЕ ЕСЛИ У ТЕБЯ ТАК ТО ТОГДА ПРОСТИТЕ БЫЛ НЕ ПРАВ!
можно пример работы?
 
Сверху Снизу