4.24 到 4.26 版本中,选中骨架网格体section 重新计算切线时,可能导致出现接缝问题。
解决方法如下:
修改GPUSkinCache.cpp 的FGPUSkinCache:: DispatchUpdateSkinTangents中的代码:
Code:
if (bFullPrecisionUV)
{
if (GAllowDupedVertsForRecomputeTangents) Shader = ComputeShader11;
else Shader = ComputeShader01;
}
else
{
if (GAllowDupedVertsForRecomputeTangents) Shader = ComputeShader10;
else Shader = ComputeShader00;
}
to
Code:
if (bFullPrecisionUV)
{
if (GAllowDupedVertsForRecomputeTangents) Shader = ComputeShader01;
else Shader = ComputeShader11;
}
else
{
if (GAllowDupedVertsForRecomputeTangents) Shader = ComputeShader00;
else Shader = ComputeShader10;
}
不修改源码的情况下,可修改Engine\Shaders\Private\RecomputeTangentsPerTrianglePass.usf
#if MERGE_DUPLICATED_VERTICES
Buffer<uint> DuplicatedIndices;
Buffer<uint> DuplicatedIndicesIndices;
#endif
.....
....
....
....
#if MERGE_DUPLICATED_VERTICES
uint DupVertexIndicesLength = DuplicatedIndicesIndices[2 * VertexIndex];
uint DupIndexStart = DuplicatedIndicesIndices[2 * VertexIndex + 1];
for(uint DupIndexOffset = 0; DupIndexOffset < DupVertexIndicesLength; ++DupIndexOffset)
{
uint DupVertexIndex = DuplicatedIndices[DupIndexStart + DupIndexOffset];
uint DupIndex = DupVertexIndex * INTERMEDIATE_ACCUM_BUFFER_NUM_INTS;
// TangentZ
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 0], IntTangentZ.x);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 1], IntTangentZ.y);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 2], IntTangentZ.z);
// TangentX
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 3], IntTangentX.x);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 4], IntTangentX.y);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 5], IntTangentX.z);
// Orientation
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 6], IntOrientation);
}
#endif
to
//#if MERGE_DUPLICATED_VERTICES
Buffer<uint> DuplicatedIndices;
Buffer<uint> DuplicatedIndicesIndices;
//#endif
.....
....
....
....
//#if MERGE_DUPLICATED_VERTICES
uint DupVertexIndicesLength = DuplicatedIndicesIndices[2 * VertexIndex];
uint DupIndexStart = DuplicatedIndicesIndices[2 * VertexIndex + 1];
for(uint DupIndexOffset = 0; DupIndexOffset < DupVertexIndicesLength; ++DupIndexOffset)
{
uint DupVertexIndex = DuplicatedIndices[DupIndexStart + DupIndexOffset];
uint DupIndex = DupVertexIndex * INTERMEDIATE_ACCUM_BUFFER_NUM_INTS;
// TangentZ
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 0], IntTangentZ.x);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 1], IntTangentZ.y);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 2], IntTangentZ.z);
// TangentX
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 3], IntTangentX.x);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 4], IntTangentX.y);
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 5], IntTangentX.z);
// Orientation
InterlockedAdd(IntermediateAccumBufferUAV[DupIndex + 6], IntOrientation);
}
//#endif