0

我有一个细分并带有 LOD 的二十面体。现在我正在尝试添加动态材质。问题是我需要法线。

我使用虚幻引擎 4,当我使用内置函数来计算法线时,我在不同 LOD 级别之间的区域中得到奇怪的伪影。 在此处输入图像描述

所以我用这个代码做了我自己的计算:

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

看来计算是对的。当我跳过着色器中的变形计算时,这些伪影消失了......也许三角形在变形它们时会彼此靠近,这会导致这种伪影?

这就是变形的样子。(来源在此处输入图像描述

4

1 回答 1

0

我通过跳过第一个变形值来解决它。现在变形从第二张图片开始,如您在屏幕截图中所见。

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

于 2019-07-11T09:33:56.143 回答