ue4 重新计算法线导致接缝问题bug解决办法

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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值