Unity Shader渲染顺序 坐标系 和光照模型

2023-11-14

1.Shader中的渲染顺序

是按照Queue"="Geometry" "RenderType"="Opaque,Queue是一般渲染时候的顺序,RenderType是后处理特效使用的渲染顺序。
Background, Geometry, AlphaTest,Transparent和Overlay,分别对应数值1000,2000,2450,3000和4000。 Shader中,如果要C#访问的uniform变量,还要声明一遍。
记得引擎渲染时候,是先更新物体,再排序,再渲染的,所以渲染为了提高效率做了合并批次(合为一张大图纹理,如果全部是透明的或者不透明的,那么各个网格可以合并尽管有先后),和渲染先后的处理。
渲染时候一帧里面有N个drawcall,每个drawcall会驱动进行一次渲染管线操作,会进行一次blend。

2.C#脚本或Shader中变换和坐标系

都是用向量左乘矩阵,矩阵也是左乘矩阵,从视图->模型的乘法顺序。是右手坐标系,列式存储。
其实世界坐标系是左手坐标系,视图坐标系是标准的右手坐标系。
透视 空间:刚好是D3DXMatrixPerspectiveFovRH中的公式, 得x'=x*xScale, y'=y*yScale,z'=a*z + b=(z + zn)*zf / (zn-zf)。zn,zf都是距离是正数,因为|z| > zn,且z是负数,所以z'是正数。
上面的变换一般用一个ShaderLab 中的MVP坐标系即可,右手坐标系的乘法顺序也要自裁剪矩阵乘以视图矩阵乘以世界矩阵的形式进行。
ndc坐标:左下角为(0,0)点,右上角为(1,1)点,屏幕中心为[0.5,0.5],z值保留了透视投影中的正值但是值的大小是世界坐标系的值。不同于D3D中的[-1,-1,0]到[1,1,1],也不同于OGL中的[-1,-1,-1]到[1,1,1]。NDC坐标系一般由硬件完成。
屏幕坐标:是OGL的左下角是(0,0)右上角是(1,1),DX却是左上角是(0,0)。
UGUI和NGUI都是屏幕坐标系,LinearRender也 类似。
鼠标点击的屏幕坐标:Input.mousePosition也是屏幕坐标系。可以看到U3D表面的世界是用了左手坐标系,实际自视图坐标系后都是右手坐标系的方式。
transform 在世界坐标系中的变换:是左手坐标系的 缩放 旋转 平移方式得到子在父坐标系中的位置。
业务情景处理,多摄像机之间的变换,利用屏幕坐标系和相对变换来处理。
知道将要指定的子节点位置position,需要求取它的世界坐标系,那么节点本身的不用考虑它的旋转和缩放因为只是影响子节点的(如果是节点上的网格那么是需要考虑的),取到该子节点position位置,对该位置进行父节点上的缩放旋转平移得到父节点在上一个节点位置,重复得到世界坐标中的位置。如果是求逆那么,一个节点整体求逆即可。

3.光照模型

surface shader中的:
struct SurfaceOutput{
half3 Albedo;// 反射光
half3 Normal; // 法线
half3 Enission; // 自发光
half Specular; // 高光
half Gloss; // 光泽度
half Alpha; // 透明度
}
half3 h = normalize (light.dir + viewDir);       
fixed diff = max (0, dot (s.Normal, light.dir));     
float nh = max (0, dot (s.Normal, h));  
float spec = pow (nh, s.Specular*128.0) * s.Gloss;// Specular是材料镜面光泽度越小亮斑越大,Gloss是材料镜面反射颜色强度,gloss调整高光更加明显。
surface shader是unity的强项, 可以使用现成的光照模型,多种光源的计算(也是应用了光照模型只是范围不同),衰减,各种阴影选项,自动的向前和延后光照模型 ;UE中内置功能丰富,但是要自己定制要花很多精力。
U3D光照还提供了light probe探针技术,和光照烘培技术。
光照模型如果有FBO的硬件下,可以启用延后光照,延后光照可以渲染复杂场景,但是因为合并FBO结果一次光照计算,不能很好的处理抗锯齿和半透明效果。
同时也不支持Unity3D中的Mesh Renderer组件的Receive Shadows功能,对Culling Masks的支持也不完善,最多能使用四个Culling Mask。
建议还是动态物体使用向前光照,结合Light probe探针效果。场景静态物件烘培。
U3D中的光照,因为是实时光照都是计算直接光照,间接光照用环境关表示。没有Max中的VRay用光线追踪还计算了间接光照。物体内部的光照也没有考虑。类似的间接光照可以用光照烘培表示。
Surface shader中:
E:\Unity3D\unity3D4.7\Editor\Data\CGIncludes\Lighting.cginc下的光照模型文件:
漫反射模型,LightingLambert 是向前光照模型,LightingLambert_PrePass是延后光照模型。
inline fixed4 LightingLambert (SurfaceOutput s, fixed3 lightDir, fixed atten)
{
fixed diff = max (0, dot (s.Normal, lightDir));
fixed4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);// atten是衰减
c.a = s.Alpha;
return c;
}
inline fixed4 LightingLambert_PrePass (SurfaceOutput s, half4 light)
{
fixed4 c;
c.rgb = s.Albedo * light.rgb;
c.a = s.Alpha;
return c;
}
镜面高光反射模型,LightingBlinnPhong 是向前光照,LightingBlinnPhong_PrePass是延后光照。
inline fixed4 LightingBlinnPhong (SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
{
half3 h = normalize (lightDir + viewDir);
fixed diff = max (0, dot (s.Normal, lightDir));
// 使用nh 当视点距离物体较远时候,viewDir被当做常量,相比Phong少了reflect计算入射光线在变化的n下的反射光线。可以提高性能。
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, s.Specular*128.0) * s.Gloss;
fixed4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);
c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
return c;
}
inline fixed4 LightingBlinnPhong_PrePass (SurfaceOutput s, half4 light)
{
fixed spec = light.a * s.Gloss;
fixed4 c;
c.rgb = (s.Albedo * light.rgb + light.rgb * _SpecColor.rgb * spec);
c.a = s.Alpha + spec * _SpecColor.a;
return c;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity Shader渲染顺序 坐标系 和光照模型 的相关文章

随机推荐

  • 用C语言解“计算工资”题

    7 10 计算工资 某公司员工的工资计算方法如下 一周内工作时间不超过40小时 按正常工作时间计酬 超出40小时的工作时间部分 按正常工作时间报酬的1 5倍计酬 员工按进公司时间分为新职工和老职工 进公司不少于5年的员工为老职工 5年以下的
  • Vue3全局提示(Message)

    Vue2全局提示 Message 可自定义设置以下属性 自动关闭的延时 duration 类型 number 单位ms 默认 3000ms 消息距离顶部的位置 top 类型 number 单位px 默认 30px 调用一次只展示一个提示 调
  • datax源码解析-任务拆分机制详解

    datax源码解析 任务拆分机制详解 写在前面 此次源码分析的版本是3 0 因为插件是datax重要的组成部分 源码分析过程中会涉及到插件部分的源码 为了保持一致性 插件都已大部分人比较熟悉的mysql为例子说明 本文我们来看看datax的
  • [云原生专题-22]:K8S - 集群编排工具K8S与SWARM比较与技术选择

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122750196 目录 前言 第1章
  • Tomcat安装及IDEA配置Tomcat教程

    Tomcat安装 以Tomcat8 5为例 1 网站链接 Apache Tomcat Apache Tomcat 8 Software Downloads 根据个人喜好 我安装的是8 5版本 2 下载完解压即可 我的安装目录为 E Envi
  • R语言入门(一)

    R语言入门 一 在vscode中使用R语言注意事项 按照其他教程安装配置插件 使用run source运行r代码 使用run code 会报错 原因未知 生成正态分布的点数据 import pandas as pd import numpy
  • win7+ VS2010安装CUDA7.0图文说明

    win7 VS2010安装CUDA7 0图文说明 1 查看本机配置 查看显卡类型是否支持NVIDIA GPU 选中计算机 gt 右键属性 gt 设备管理器 gt 显示适配器 NVIDIA GeForce GT 610 从https deve
  • Servlet 基础知识(4)(利用Servlet实现文件上传功能)

    目录 1 DiskFileUpload 类 1 setSizeMax 方法 2 setSizeThreshold 方法 3 setRepositoryPath 方法 4 parseRequest HttpServletRequest req
  • TOOLS_Python获取音域范围

    基于librosa pyin方法 链接 获取基频最值 对比标准音高序列 得到音域范围 def create standard pitch sequence 生成一个包含名称的标准音高序列 T C C D D D E E F F G G G
  • 第七届蓝桥杯省赛C++B组 最大比例

    最大比例 X星球的某个大奖赛设了M级奖励 每个级别的奖金是一个正整数 并且 相邻的两个级别间的比例是个固定值 也就是说 所有级别的奖金数构成了一个等比数列 比如 16 24 36 54 其等比值为 3 2 现在 我们随机调查了一些获奖者的奖
  • sublime text3 安装 golangsublime 配置

    1 安装git 因为golang是通过git来管理远程包的 所以我们首先要安装git 下载地址 http www git scm com download git安装比较简单 直接下一步即可 在Windows Explorer integr
  • Spring Boot:如何配置Undertow容器?不会我教你

    环境说明 Windows10 Idea2021 3 2 Jdk1 8 SpringBoot 2 3 1 RELEASE 一 前言 作为springboot开发者 使用最多的就是Tomcat 这是springboot默认的容器技术 而且是内嵌
  • MyEclipse修改.properties文件的编码

    MyEclipse中新建一个messageResource properties文件 如果输入中文保存时就会提示错误 Save could not be completed Reason some characters cannot be
  • 京东零售大佬为你讲解:黑盒测试的底层逻辑

    什么是黑盒测试 它是把程序看作一个黑盒子 在不考虑程序内部结构的情况下 检查程序功能是否按照PRD的规定正常使用 程序是否能适当地接收输入数据 产生正确的输出 这其实就是黑盒测试的定义 也是黑盒测试的底层逻辑 一般人不会重视定义 但往往就是
  • html5 canvas(小树姐的牛掰到爆了的作品)

    自从小树嫁了个牛逼的前端之后 canvas的境界超过我了 小树demo 小编表示 这个境界 这个几何 让我有种跪舔的感觉 http www wow trend com brand index shtml 这个hover让我彻底凌乱了 div
  • react中Hooks

    React Hook Hooks是什么 常见的Hook 1 state Hook 2 Effect Hook 3 Ref Hook 4 Context Hook React Hook Hooks是什么 1 Hook是react 16 8版本
  • Qt的ui文件不能简单复制

    在使用vs Qt开发时 直接复制另外一个widget类的ui文件 简单改名成当前类对应的ui文件 会导致编译出错 尽可能使用添加的Qt class自带的ui文件 因为ui文件的配置文件中有许多与当前类相关的字符串 简单复制容易报错
  • 二叉树的结点数

    二叉树的结点数 10分 已知二叉树的结点结构定义如下 typedef struct NODE char data struct NODE lch rch NODE 说明 data 为数据域 均为英文大写字母 lch 和 rch 分别为指示左
  • 抖音视频怎么去水印

    水印 一般是指放置在图片 视频或者文档上的文字或者图标 用来做标记或者品牌宣传 我们从网上获取的文件资源很多都是带有水印的 比如从抖音短视频下载的视频就会带有水印 为了达到更好的观看效果 我们就需要将这些视频自带的水印给去除掉 下面就来教教
  • Unity Shader渲染顺序 坐标系 和光照模型

    1 Shader中的渲染顺序 是按照Queue Geometry RenderType Opaque Queue是一般渲染时候的顺序 RenderType是后处理特效使用的渲染顺序 Background Geometry AlphaTest