CDLOD проблема с освещением во время преобразования треугольников - PullRequest
0 голосов
/ 10 июля 2019

У меня есть Икосаэдр, подразделенный и с LOD.Сейчас я пытаюсь добавить динамический материал.Проблема в том, что для этого мне нужны нормали.

Я использую Unreal Engine 4, когда я использую встроенную функцию для вычисления нормалей, я получаю странные артефакты в области между различными уровнями LOD.enter image description here

Итак, я сделал свой собственный расчет с этим кодом:

    TArray<FVector> normals;
    normals.Init(FVector(-1.f, -1.f, -1.f), geoData.GeoData.Num());
    int32 triangleCount = geoData.Triangles.Num() / 3;

    for (int32 i = 0; i < triangleCount; i++)
    {
        int32 normalTriangleIndex = i * 3;
        int32 triangleIndexA = geoData.Triangles[normalTriangleIndex];
        int32 triangleIndexB = geoData.Triangles[normalTriangleIndex + 1];
        int32 triangleIndexC = geoData.Triangles[normalTriangleIndex + 2];

        FVector pointA = geoData.GeoData[triangleIndexA];
        FVector pointB = geoData.GeoData[triangleIndexB];
        FVector pointC = geoData.GeoData[triangleIndexC];

        FVector sideAB = pointB - pointA;
        FVector sideBC = pointC - pointB;


        FVector nNormal;
        nNormal = FVector::CrossProduct(sideAB, sideBC);

        nNormal = nNormal / nNormal.Size();
        nNormal = nNormal.GetSafeNormal();

        normals[triangleIndexA] = -nNormal;
        normals[triangleIndexB] = -nNormal;
        normals[triangleIndexC] = -nNormal;
    }

Кажется, что вычисления верны.когда я пропускаю вычисление морфинга в моем шейдере, эти артефакты исчезают ... Может быть, треугольники должны быть близки друг к другу при их морфинге, и это вызывает эти артефакты?

Так выглядит морфинг.( Источник ) enter image description here

1 Ответ

0 голосов
/ 11 июля 2019

Я решил это, пропустив первое значение морфа. Теперь морфинг начинается со второй картинки, как вы можете видеть на скриншоте.

float morphFac(float dist, int lev)
{
    float low = input_distanceLUT[lev - 1];
    float high = input_distanceLUT[lev];
    float delta = high - low;
    float a = (dist - low) / delta;
    float morphRange = 0.5f;
    return 1.0f - clamp(a / morphRange, 0.1f, 1.0f);
}

Просто небольшое изменение в шейдере. зажим (a / morphRange, 0.1f, 1.0f); 0.1f был раньше 0.0f

...