DCC和unreal中的法线与切线

(maya)

绿:法线, 红:切线, 蓝:副切线(ue4)

uv channel 0

法线由DCC软件确定,一般使用两种:(该点为三根线的端点)

三根法线合一,为相邻三个面法线的平均,在shader中视作一个点,

与相邻面法线 同向,unreal视作三个点,可能因为一个点对应的inputlayout(顶点缓冲布局) 只对应一组 NORMAL语义,

切线(作为切线空间的x轴)方向必定与法线方向垂直,并且与uv坐标的 u轴在垂直法线的平面的投影向量 同向,

裁UV 导致一个点有多个方向切线和副法线,导入unreal 一个点直接算作多个点,保证一个点 对应一组 normal,tangent,binormal(上图 由于裁UV 25个点变30个点)

法线变换,非均匀缩放:

制作模型确定顶点法线,同时由法线确定切线,导入unreal 此时 法线和切线必定垂直,但缩放(模型空间)
在unity中 对模型进行非均匀缩放(上图1/4缩小),
a. 左点:法线与临近的面法线同向,要求变换时依旧保持与 面法线同向
                切线 则 与该面平行
        缩放后,两法线失效,两切线依旧保持 与面平行,
b. 右点:法线是个平均值(与重心距离加权),在此处,渲染时 是光滑过渡,
        缩放后,切线方向,仍然由面确定,
        

法线的计算

渲染时,需要计算光照,需要 世界空间的 顶点或像素的法线方向,由于模型可能存在非均匀缩放,所以不能使用 (float3x3) _Object2World矩阵,

《unityshader入门精要》

若M1 *M2 *M3 =M1* M3, 则M2为单位矩阵,设M1 为[ aij ] M2 为[ bij ] M3为 [ cij ] 直接相乘,就能找到规律。

所以 要使用:模型到世界矩阵 的逆 的转置

UnityObjectToWorldNormal()

// Transforms normal from object to world space
inline float3 UnityObjectToWorldNormal( in float3 norm )
{
#ifdef UNITY_ASSUME_UNIFORM_SCALINGreturn UnityObjectToWorldDir(norm);
#else// mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}return normalize(mul(norm, (float3x3)unity_WorldToObject));
#endif
}// Transforms direction from object to world space
inline float3 UnityObjectToWorldDir( in float3 dir )
{return normalize(mul((float3x3)unity_ObjectToWorld, dir));
}

若均匀缩放,则直接使用UnityObjectToWorldDir()

若非均匀缩放,则乘以逆矩阵的转置(此处mul函数参数顺序,会转置该逆矩阵)。

   

Unity Shader Lab 模型切线和法线相关推荐

  1. unity Shader Lab(cg hlsl glsl)着色器入门教程 以及 vs2019 支持unity shader语法(更新中2019.9.5)

    前言: 如果你对cg glsl hlsl 顶点着色器 片段着色器 表面着色器 固定渲染管线 等等有所疑惑,或是想学会unity的渲染,看这一篇就足够了.另外我博客的shader分类中还有很多shade ...

  2. 《Unity Shader入门精要》 第五章 开始学习Unity Shader之旅 笔记

    开始学习Unity Shader之旅 最简单的片元着色器 #pragma vertex vert #pragma fragment frat 告诉Unity那个函数包括顶点着色器的代码,哪个函数包括片 ...

  3. 第四章 开始Unity Shader学习之旅(1)

    1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...

  4. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  5. Unity Shader 学习记录(3) —— CG语言和Shader文件

    1 什么是语义 赋给shader的输入输出的字符串,表达了参数的含义.语义告诉shader从哪里获取数据,又把数据输出到哪里. 2 Shader的三种debug方法 1 假色彩图像 2 VStudio ...

  6. unity shader中 CG和GLSL之间矩阵存储方式的差异

    在unity shader中计算切线空间光照的时候发现TBN矩阵在计算后并没有转置,这和在GLSL.线代中的计算方法相差一个转置的步骤,因为在GLSL中直接求得的TBN矩阵是切线空间到世界空间的变换, ...

  7. 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅

    本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...

  8. 如何用Unity Shader制作类似《炉石传说》卡牌的动态效果?

    此篇为鄙人在卡牌项目中,尝试模仿<炉石传说>卡面特效所制作的特效Shader总结回顾,几经修改,最终成为了现在的样子,因为使用简单,效果明显,虽然距离<炉石传说>的卡面特效还有 ...

  9. Unity Shader学习案例一: 流光效果

    Unity Shader Lab新手宝典简单Shader案例一:流光效果 + 相关基础知识说明 Shader "Samples/Light Flow"//shader名称 {Pro ...

最新文章

  1. DataGrid 的 全选/取消全选 控制(CheckBox)
  2. 【Leetcode | easy】有效的括号
  3. CCF真题 201312-1 出现次数最多的数
  4. 百度安全入选中国工业互联网安全市场研究报告推荐服务商
  5. C#正则表达式的特定字符或转义序列
  6. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学
  7. java ssh 那一层应该捕获异常_ssh经典异常!
  8. c 语言转换成java语言,求助大神!!!JAVA转换成C语言
  9. 【图像融合】基于matlab对比度和结构提取多模态解剖图像融合【含Matlab源码 1539期】
  10. 网站页面黑白色效果实现技巧
  11. Java菜鸟教程 面向对象初步(一)
  12. 如何提升代码的安全性 —— 代码混淆
  13. socket服务器主动下发消息,socket服务器主动发送消息给客户端
  14. HTML页面基本结构。
  15. 测试在团队中有啥用?
  16. 11月合资SUV销量:日系车统治榜单 大众产品攻势“拳意渐乱”
  17. 数据库银行业务基础知识
  18. 如何更聪明地学习:20种让你更高效学习的科学方法
  19. 【傲腾观察室】英特尔® 傲腾™技术,助力金融行业数据库价值迸发!
  20. 良心推荐:看完这10部豆瓣高分美剧,英语水平提升几个Level!

热门文章

  1. 女神节活动 送她链上专属藏品,爱要大胆晒出来
  2. iphone型号表_iPhone各地区型号对照表.doc
  3. matlab 怎么嵌套循环,Matlab嵌套循环
  4. 数据库mysql工序_网易杭研总结:数据库高可用技术之道(4)
  5. SAP S4 MM配置详解之三:物料主数据-定义物料类型/物料状态/字段选择控制/物料组
  6. 计算机房灭火器单具基准,灭火器计算题这6个步骤吃透了,此考点的分数也不会丢了...
  7. 地狱飞龙 [simpson][积分
  8. python 多线程利器-tomorrow
  9. 分析及解决:虚拟机无法连接虚拟设备idel 0:1 问题
  10. 云计算系统体系架构介绍