个人学习使用,摘抄《unity shader 入门》一书中部分重要内容

创建 shader

在 unity 中使用 shader (手写):

  1. 创建材质,创建 shader ,将 shader 应用于材质

  2. 创建物体(需要有 meshrender、meshfliter 组件),将材质应用于物体

  3. 在材质面板中,调整 shader 属性改变物体外观

创建 shader 时的预设:


选项分别为:

  • 包含标准光照模型的表面着色器(和光源打交道)
  • 不含光照 (含雾效) 的顶点 / 片元着色器(光源较少、需要自定义渲染效果)
  • 实现屏幕后处理效果的模板
  • 利用GPU并行性进行一些计算的模板
  • 包含光线追踪相关计算的模板

还可以通过 shader graph 图形界面来创建 shader ,两种创建方法在 unity 内部作用的一致。

shaderLab

unity 为方便用户写 shader 专门提供的一种语言——shaderLab 格式类似 JSON :

一个 shader 包括自身信息、子着色器 SubShader 和默认着色器 Fallback 三部分

// shader 名称
Shader "Custom/ToonShader" {Properties {// 属性的名字(用于 shader 计算应用各种效果) 显示在面板上的名字(用于提示用户方便调整各种效果) 属性的类型(数据类型)// 支持的类型 int float range color vector 2d cube 3d_Color ("Color", Color) = (1,1,1,1)}SubShader {// 显卡A使用的子着色器 的代码// 可选的标签Tags { "RenderType"="Opaque" }// 可选的状态Cull FrontZWrite Off// 代表一次渲染流程Pass {// 定义名称Name "OUTLINE"// 定义 Pass 在 unity 渲染流水线中的角色Tags{ "LightMode" = "Always" }}}SubShader {// 显卡B使用的子着色器[Tags][RenderSetup]Pass {[Name][Tags][RenderSetup]}}// 当显卡无法执行以上任何一个着色器时,默认使用的着色器FallBack "Diffuse"
}



表面着色器是 unity 提供的对顶点/片元着色器的一种抽象(本质上自动会转化为顶点/片元着色器),自动处理光照细节,让用户方便快捷地使用 shader
定义在 subshader 语句块中,而非 pass 语句块,在 CGPROGRAM 关键字与 ENDCG 之间(使用CG/HLSL语言编写)。

Shader "..." {SubShader {Tags {}CGPROGRAM#pragma surface surf Lambertstruct Input {float4 color : COLOR;};void surf(Input IN, inout SurfaceOutput o) {o.Albedo = 1;}ENDCG}
}

片元/顶点 着色器定义在 pass 语句块中

Shader "..." {SbuShader {Pass {CGPROGRAM// 编译指令#pragma vertex vert#pragma fragment fragfloat4 vert(float4 v : POSITION) : SV_POSITION {return mul (UNTY_MATRIX_MVP, v);}fixed4 frag() :SV_Target {return fixed4(1.0,0.0,0.0,1.0);}ENDCG}}
}

上述两种都是较新的可编程管线,较旧的设备可能不支持,就需要使用固定函数着色器

unity 中,模型空间使用左手坐标系

观察空间使用右手坐标系,相机沿着 -Z 方向看,Z 值越小,离摄像机越远

数学基础

笛卡尔坐标系(原点、两或三条垂直的轴)、点和向量

左手坐标系和右手坐标系

矢量和标量、矢量乘除标量、三角形法则、矢量的模

方向向量、归一化、点积和叉积

点积的意义:投影、向量之间夹角的余弦(判断玩家是否处于敌怪前方的视角范围)

点积的性质:点积与标量乘法结合、点积与矢量加减结合、自身的点积等于模的平方

叉积的意义:得到同时垂直于两个向量的新向量(法向量)、向量之间夹角的正弦、判断三角形面朝里还是朝外(根据左手坐标系、三个顶点逆时针排列时三角形面朝向正前方)

矩阵

用来描述矢量的坐标空间转换、矢量的位置变换

把矢量转化成行矩阵或列矩阵,参与矩阵的运算,就能得到变换后的矢量(在unity中把矢量转化为列矩阵,放在最右边参与矩阵的运算,阅读时从右往左阅读,矢量使用矩阵进行变换)

矩阵和标量的乘法、矩阵和矩阵的乘法(新矩阵的每个元素Cij的值,等于原矩阵A中i行和B中j列矢量的点积)

特殊的矩阵

方阵(又叫方块矩阵,行列数目相同)、对角矩阵(对角线上元素不为0,其余元素为0的方阵)、单位矩阵(对角线上元素为1,其余为0的方阵)、转置矩阵(行列交换、串接再转置等于转置再反向串接)

逆矩阵(首先得是方阵,然后它与原矩阵的乘积为单位矩阵)

如果矩阵有逆矩阵,它就是可逆的(非奇异的)(行列式不为0);否则它就是不可逆的(奇异的)。

逆矩阵的性质:逆矩阵的逆矩阵是它本身、单位矩阵的逆矩阵是它本身、转置再求逆等于求逆再转置、串接再求逆等于求逆再反向串接

正交矩阵:矩阵和它的转置矩阵乘积为单位矩阵,那么这个矩阵就是正交矩阵(结合逆矩阵的定义,我们发现正交矩阵的转置等于正交矩阵的逆矩阵)

矩阵与它的转置矩阵乘积的结果的行矢量是单位矢量、且互相垂直时(矩阵行列之间构成一组标准正交基矢量),那它就是一个正交矩阵。P60

变换

矩阵表示变换

线性变换:可以保留矢量加法、矢量与标量乘法的变换,定义变换

f ( x ⃗ + y ⃗ ) = f ( x ⃗ ) + f ( y ⃗ ) f ( k x ⃗ ) = k f ( x ⃗ ) \mathbf{f}(\vec{x}+\vec{y}) = \mathbf{f}(\vec{x}) + \mathbf{f}(\vec{y})\\\mathbf{f}(k\vec{x})=k\mathbf{f}(\vec{x}) f(x +y ​)=f(x )+f(y ​)f(kx )=kf(x )

线性变换包括:缩放、旋转、错切、镜像、正交投影,都可以 3 x 3 的矩阵表示

但是平移变换不能

因此引入仿射变换,仿射变换就是合并了线性变换和平移变换的变换类型,把矢量扩展到了四维空间用 4 x 4 的矩阵表示,这就是齐次坐标空间

因此需要把原先的三维向量转换为四维向量,这就是齐次坐标(可以超过四维)

对于原先的一个点,转化为四维坐标时,w 值为 1;对于原先的方向矢量,转化为四维坐标时,w 值为 0

平移矩阵、缩放矩阵、旋转矩阵(与GS101图形学入门中的变换矩阵相同,故省略)

大多数情况下,我们约定组合变换的顺序是:先缩放,再旋转,最后平移

unity 中绕多个轴旋转时的顺序zxy

坐标变换

顶点着色器阶段时,模型的顶点坐标要从模型空间,转换到齐次裁剪坐标空间中(单位正方体空间)

模型空间 model space:又称对象空间、局部空间,是和对象有关的独立坐标空间,unity中模型空间使用左手坐标系

世界空间 world space:最外层的坐标空间,用于描述绝对位置,左手坐标系

观察空间 view space:又称摄像机空间,摄像机为原点,在unity中摄像机后方为+Z轴、右方为+X轴、上方为+Y轴

观察空间使用右手坐标系,符合 OpenGL 标准,摄像机正前方为-Z轴

将模型坐标从世界空间转换到观察空间时,由于从左手坐标系转换到右手坐标系,需要对 z 分量取反,就是再乘上一个特殊矩阵 [ 1 0 0 0 0 1 0 0 0 0 − 1 0 0 0 0 0 ] \left[\begin{matrix}1&0&0&0\\0&1&0&0\\0&0&-1&0\\0&0&0&0\end{matrix}\right] ⎣ ⎡​1000​0100​00−10​0000​⎦ ⎤​ 来得到最终结果 P76

裁剪空间 clip space :由摄像机可以看到的空间,视锥体决定的空间。视锥体由 6 个平面包围而成,又叫裁剪平面。其中,近裁剪平面和远裁剪平面决定摄像机能看到的深度范围。

视锥体有两类分别对应两种投影类型:正交投影和透视投影

为了更通用的表示两种投影,我们先将顶点从观察空间转换到裁剪空间(这一步就是投影变换)中,之后根据 6 个裁剪平面的坐标进行裁剪(判断物体是否可见、部分可见)。

顶点进行正交投影后,w分量仍为1;进行透视投影后,w分量为-z。

屏幕空间:由像素点组成的二维空间。从裁剪空间变换到屏幕空间,需要经过齐次除法,得到归一化的设备坐标(在标准立方体中的坐标,OpenGL是[-1,1]的坐标范围,directX是[0,1]的坐标范围,unity使用OpenGL的规范)。

unity 中,屏幕坐标系左下角是 (0,0) ,将上述的 [-1,1] 坐标范围经过缩放,映射到 (0,0) ~ (screenWidth,screenHeight) 就能得到像素坐标

整个渲染流水线中,顶点经过了哪些坐标变换?P70
M–模型变换、V–观察变换(视图变换)、P–投影变换、屏幕映射(视口变换)

法线变换

模型的顶点往往带有法线信息,用变换矩阵变换顶点和大部分方向向量没问题,但是变换法线时可能出现问题。例如在进行非统一缩放变换时,变换后的法线不再垂直。因此需要一个新的矩阵来变换法线。

首先,法线垂直于切线,又因为切线可以由两个顶点之间的差值计算,那么我们就可以拿变换后的切线来算出法线

推导过程省略,最后的结论就是,原变换矩阵的逆转置矩阵可以用来变换法线,得到正确的结果。P87

unity-shader-2相关推荐

  1. Unity Shader 阴影

    最近在看Unity shader开发实战详解,刚开始看阴影部分,稍微有了点思路.在这里写点笔记,算是小结吧. .阴影实现方法 一种是通过模拟光照的原理,用向量的方法 找到被光线照射的点 映射到平面的位 ...

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

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

  3. Unity shader学习之屏幕后期处理效果之高斯模糊

    高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...

  4. Unity Shader着色器优化

    对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...

  5. vs unity shader插件_一些Shader资料

    [Unity Shader] 常用的数值类型和语义 unity shader编辑器语法高亮插件 Unity Shader-法线贴图(Normal)及其原理 Unity 提供的CG/HLSL语义 (se ...

  6. Unity Shader 序列帧动画

    shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分. Unity Shader 内置时间变量 名称 类型 描述 _Time floa ...

  7. qnetworkreply 获取状态_谈谈Unity Shader中的采样器状态和(Texture Filtering)纹理滤波方式

    参考文章: 使用采样器状态 - Unity 手册​docs.unity3d.comhttps://blog.csdn.net/chenjinxian_3D/article/details/518169 ...

  8. Unity Shader 之 透明效果

    本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...

  9. unity shader入门精要_Unity Shader 入门(一):渲染流水线

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门紧要学习 candycat1992/Unity_Shaders_Book​github.com 1.2 还有一些图形学的历史 ...

  10. 【Unity Shader】(六) ------ 复杂的光照(上)

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题.              [Unity Sha ...

最新文章

  1. 十六进制字符转化为十进制数字
  2. git常用命令速查表【转】
  3. ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
  4. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)
  5. RHEL6入门系列之十,常用命令3
  6. OpenCV 发起 Spatial AI挑战赛
  7. 《linux设备驱动开发详解》笔记——14 linux网络设备驱动
  8. linux的下载工具
  9. office2016+visio2016
  10. 一种word版题库制作成excel版步骤
  11. 计算机驱动程序安装不了,Win7系统安装不了主板驱动的解决方法
  12. 不懂Shopee站点分析,入驻Shopee平台哪个站点?
  13. Unity Shader - Secondary Maps (Detail Maps) Detail Mask 第二部分贴图(细节贴图)
  14. 数据可视化|用热力地图进行数据分析
  15. Linux学习6 脚本登录主机 数组 排序 系统负载查询命令 定期备份
  16. python求这个三位数的数字之和及乘积(超详细解答)
  17. php微信卡包代码,微信卡券,在卡包中跳转到小程序的字段怎么填写
  18. 周易六十四卦——谦卦
  19. 分享图片+文字到微信朋友圈
  20. fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared

热门文章

  1. 红米note升级android,新版红米Note配置升级:系统基于Android 4.4.2
  2. 天微TM1650数码管驱动IC新旧版 驱动和注意事项
  3. 一键命令测试云主机的带宽
  4. 安卓app开发-03-项目的基本开发步骤
  5. Python数据分析 ---- ARMA模型
  6. c语言递推算法微课,高中数学题型方法100讲[微课视频]
  7. Python读文件与写文件
  8. mendix费用价格
  9. 《中国高等教育学历认证报告》申请中,添加高等学历认证对话框中信息填写完后提示“信息有误”
  10. 华工计算机网络辅修,【JZT干货】双手献上华工辅修攻略