变形三角形时的 CDLOD 照明问题
CDLOD issue with lighting while morphing triangles
我有一个细分的二十面体和 LOD。现在我正在尝试添加动态 Material。
问题是我需要法线。
我使用 Unreal Engine 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;
}
看来计算正确。当我跳过我的着色器中的变形计算时,那些伪影消失了......
也许三角形在变形时会彼此靠近,这会导致这种伪像?
这就是变形的样子。 (Source)
我通过跳过第一个变形值解决了这个问题。
正如您在屏幕截图中看到的,现在变形从第二张图片开始。
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);
}
着色器中的一个小改动。 clamp(a / morphRange, 0.1f, 1.0f);
0.1f 更早 0.0f
我有一个细分的二十面体和 LOD。现在我正在尝试添加动态 Material。 问题是我需要法线。
我使用 Unreal Engine 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;
}
看来计算正确。当我跳过我的着色器中的变形计算时,那些伪影消失了...... 也许三角形在变形时会彼此靠近,这会导致这种伪像?
这就是变形的样子。 (Source)
我通过跳过第一个变形值解决了这个问题。 正如您在屏幕截图中看到的,现在变形从第二张图片开始。
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);
}
着色器中的一个小改动。 clamp(a / morphRange, 0.1f, 1.0f); 0.1f 更早 0.0f