tajourney tajourney
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
  • 注册
  • 登录
首页 › 渲染 › NPR › 描边法线平滑工具

描边法线平滑工具

糯米
2年前NPR阅读 1,862

MiToon内置的法线平滑工具,先看效果:

工具介绍

法线平滑面板如下:

描边法线平滑工具-tajourney
描边法线平滑工具-tajourney

内置了三种平滑后法线输出模式:UV7,VertexColor,Tangent。

内置了一种法线压缩格式:八面体压缩(Octahedron),以及不压缩的方式。

此外,还可以启用角度加权平滑,对于同一位置顶点个数>设置阈值的位置启用特殊的加权平滑,对于发尖这种描边容易断裂的位置有更好的平滑效果。

使用示例

法线平滑

描边法线平滑工具-tajourney

易断裂位置法线平滑

未平滑:

描边法线平滑工具-tajourney

正常平滑:

描边法线平滑工具-tajourney

启用加权角度平滑

描边法线平滑工具-tajourney

部分代码

描边法线平滑工具-tajourney

根据三角面相应角度加权平滑:

        public static float CalculateWeightedAngle(Vector3[] vertices,int[] indices,int currentIndex,out Vector3 smoothNormal)
        {
            //The following vectors are defined in Object Space. Such as: tangent ==> tangentOS
            Vector3 P1 = vertices[indices[0]];
            Vector3 P2 = vertices[indices[1]];
            Vector3 P3 = vertices[indices[2]];

            Vector3 D1 = Vector3.zero;
            Vector3 D2 = Vector3.zero;

            switch(currentIndex)
            {
                case 0:
                    D1 = P1 - P3;
                    D2 = P2 - P1;
                    break;
                case 1:
                    D1 = P2 - P1;
                    D2 = P3 - P2;
                    break;
                case 2:
                    D1 = P3 - P2;
                    D2 = P1 - P3;
                    break;
            }

            D1 = D1.normalized;
            D2 = D2.normalized;

            smoothNormal = Vector3.Cross((P1 - P3), (P2 - P1));
            smoothNormal = smoothNormal.normalized;
            
            float angle = Mathf.Acos(Vector3.Dot(D1, -D2));
            return angle;
        }

平均算法平滑法线:

 smoothedNormalHashMap[vertices[vertexIndex]] += normals[vertexIndex];

按照角度加权平均平滑法线:

 Vector3 smoothNormal = Vector3.zero;
 float angle = CalculateWeightedAngle(vertices, indices, j ,out smoothNormal);
 smoothedNormalHashMap[vertices[vertexIndex]] += angle * normals[vertexIndex];

按照面积加权平均平滑法线:

smoothedNormalHashMap[vertices[vertexIndex]] += normals[vertexIndex];
smoothedNormalHashMap[vertices[vertexIndex]] = smoothedNormalHashMap[vertices[vertexIndex]].normalized;

to do

1.平滑法线能够同时写入描边宽度。

2.支持更多的压缩算法。

其他

这里记录一些其他DCC里自动平滑的工具:

Blender

1.https://github.com/blackears/blenderNormalBrush

赞(0)
搜索
近期文章
  • 终末地人物渲染(更新中) 2025年3月17日
  • Unity APV体素化光栅化实现 2025年2月5日
  • Unity 不同 ReflectionProbe 打断 Instancing 解决方案 2025年1月15日
  • Renderdoc 原神截帧记录 2024年8月22日
  • Houdini VAT:Vellum Cltoh笔记 2 2024年7月17日
归档
  • 2025年3月 (1)
  • 2025年2月 (1)
  • 2025年1月 (1)
  • 2024年8月 (1)
  • 2024年7月 (2)
  • 2024年1月 (1)
  • 2023年10月 (3)
  • 2023年9月 (4)
  • 2023年8月 (5)
  • 2023年7月 (4)
  • 2023年6月 (4)
  • 2023年5月 (1)
  • 2023年4月 (3)
  • 2023年3月 (11)
  • 2023年2月 (11)
  • 2023年1月 (1)
  • 2022年7月 (1)
  • 2022年6月 (2)
  • 2022年5月 (1)
  • 2022年4月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (7)
  • 0
Copyright © 2022-2025 tajourney. Dev by nuomi 版权所有.
鲁ICP备19015245号
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
糯米
日语学习中
68
文章
15
评论
44
喜欢