UnityShader
文章平均质量分 79
小蜗牛zjt
离开舒适区,改变旧习惯,养成优秀的习惯。
展开
-
【UnityShader】双面渲染的透明效果
目录总述透明度测试的双面渲染透明度混合的双面渲染透明度测试双面渲染的实现透明度混合双面渲染的实现总述在现实生活中,如果一个物体是透明的,意味着我们不仅仅可以透过它看到其他物体的样子,也可以看到它内部的结构。但是在前面实现的透明效果中,无论是透明度测试还是透明度混合,都无法观察到正方体内部及其背面的形状,导致物体看起来好像只有半个一样。这是因为,默认情况下渲染引擎剔除了物体背面(相对于摄像机的方向)的渲染图元,而只渲染了物体的正面。如果想要得到双面渲染的效果,可以使用Cull指令来控制需要剔除哪个面的渲染原创 2020-06-26 08:18:35 · 910 阅读 · 0 评论 -
【UnityShader】透明度混合
快速浏览总述透明度混合基本原理透明度混合的实现Blend 命令关闭深度写入带来的问题开启深度写入的半透明效果ColorMaskShaderLab的混合命令注意Blend命令详述混合因子BnendOp BlendOperation(混合操作命令)常见的混合类型透明度混合代码实现开启深度写入的半透明效果代码实现总述关闭深度写入,ZWrite Off,不会修改深度缓冲中的值,但不影响修改颜色缓冲中的值。原因:如果不关闭深度写入,就无法透过半透明表面看到后面的物体了。不需要关闭深度测试;Unity 在使用原创 2020-06-26 08:10:51 · 1424 阅读 · 0 评论 -
【UnityShader】透明度测试
透明度度测试缺点透明度度测试结果,要么完全透明,要么完全不透明;而且,得到的透明度效果在边缘处往往参差不齐,有锯齿,这是因为在边界处纹理的透明度的变化精度问题。透明度测试基本原理:只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方法来处理它。透明度测试不需要关闭深度写入可以利用深度缓冲按逐像素的粒度进行深度排序,保证渲染的正确性。通常使用 Clip 函数来进行透明原创 2020-06-25 11:08:32 · 536 阅读 · 0 评论 -
【UnityShader】透明效果和渲染顺序
Unity 中实现透明效果的方法:透明度测试;透明度混合;深度缓冲深度缓冲,根据深度缓存中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在于深度缓冲中的进行比较(如果开启了深度测试),如果它的值距离摄像机更远,说明这个片元不应该被渲染到屏幕上(有物体挡住了它);否则,这个片元应该覆盖掉此时颜色缓冲中的像素值,并把它的深度值更新到深度缓冲中(如果开启了深度写入)。渲染的顺序渲染引擎一般都会先对物体进行排序,在渲染。渲染的顺序:先渲染所有不透明的物体,并开启它们原创 2020-06-25 09:39:59 · 2613 阅读 · 0 评论 -
【UnityShader】遮罩纹理
基础知识遮罩运行我们可以保护某些区域,使它们免于某些修改。常见使用在之前的实现中,我们都是把高光反射应用到模型表面的所有地方,即所有的像素都使用同样大小的高光强度和高光指数。但有时,我们希望模型表面某些区域的反光强烈一些,某些区域弱一些。可以使用一张遮罩纹理来控制光照。在制作地形材质时需要混合多张图片,例如表现草地的纹理,表现石子的纹理等,使用遮罩纹理可以控制如何混合这些纹理。使用流程:通过采样得到遮罩纹理的纹素值,然后使用其中某个(或某几个)通道的值(如col.r)来与某种表面属原创 2020-06-13 15:23:39 · 311 阅读 · 0 评论 -
【UnityShader】渐变纹理
基础知识使用漫反射浮点值来映射到渐变图上的某一个颜色值,最终根据灯光计算后的方向来映射整个渐变纹理到物体表面。纹理其实可以用于存储任何表面属性。一种常见的用法就是使用渐变纹理来控制漫反射光照的结果。在之前计算漫反射光照时,使用的是表面法线和光照方向的点积结果与材质漫反射率来得到表面的漫反射光照。这种技术,可以保证物体的轮廓线相比于之前使用的传统漫反射更加明显,而且能够提供多种色调变化。注意:需要把渐变纹理的 Wrap Mode 设置为 Clamp 模式,以防止对纹理进行采样时由于浮原创 2020-06-13 15:22:15 · 340 阅读 · 0 评论 -
【UnityShader】凹凸映射之高度贴图和法线贴图
目录基础知识高度纹理Unity 中的法线纹理类型法线纹理基础知识纹理的另一种场景的应用就是凹凸映射。凹凸映射的目的是使用一张纹理来修改模型表面的法线,以便为模型提供更多的细节。这种方法不会真的改变模型的顶点位置,只是让模型看起来好像是"凹凸不平"的,可以从模型的轮廓处看出“破绽”。有两种主要的方法可以用来进行凹凸映射:使用一张高度纹理来模拟表面位移,然后得到一个修改后的法线,这种被称为高度映射;使用一张法线纹理来直接存储表面法线,这种被称为法线映射;注意:凹凸映射,从纹理中得原创 2020-06-13 15:18:56 · 2655 阅读 · 0 评论 -
【UnityShader】纹理基础与属性
纹理基础知识纹理的最初目的是使用一张图片来控制模型的外观,使用纹理映射技术,可以把一张图“黏”在模型的表面,逐纹素的控制模型的颜色。UV坐标通常被归一化到[0, 1]范围内。在 OpenGL 中,纹理空间的原点位于左下角,而在 DirectX 中,原点位于左上角。samplar2D _MainTex;float4 _MainTex_ST; // 纹理的属性,ST为缩放和平移的缩写,_MainTex_ST.xy缩放值,_MainTex_ST.zw 偏移值。可以在材质面板中调节,对应的原创 2020-06-13 15:08:31 · 752 阅读 · 0 评论 -
【UnityShader】高光反射光照模型
光照模型基本光照模型中高光反射部分的计算公式Cspecular = (Clight * Mspecular)max(0, v*r)Mgloss参数: Mgloss 光泽度,反光度,控制高光区域的大小,值越大,亮点越小 Mspecular 材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色 Clight 光源颜色和强度 v 是视角方向 r 是反射方向,可以通过计算反射方向的函数 r = reflect(I,n) I,入射方向(要求由光源指向交点处)原创 2020-06-13 14:57:56 · 400 阅读 · 0 评论 -
【UnityShader】漫反射光照模型
兰伯特光照模型Cdiffuse = (Clight*Mdiffuse)max(0,n*l)参数: n 表面法线 I 指向光源的单位矢量 Mdiffuse 材质的漫反射颜色 Clight 光源颜色 max 防止物体被从后面来的光源照亮,CG 提供了这样的函数 saturate。函数:saturate(x)描述:把x截取在(0, 1]范围内,如果x是一个矢量,那么会对它的每一个分量进行这样的操作。半兰伯特光照模型Cdiffuse = (Clight*Mdiffuse)(a(n*l)原创 2020-06-13 09:51:08 · 293 阅读 · 0 评论 -
【UnityShader】基础光照类型
目录综述准光照模型自发光(Cemissive)高光反射(Cspecular)漫反射(Cdiffuse)环境光(Cambient)标准光照模型公式环境光自发光漫反射高光反射Phong 模型计算高光反射的部分:Blinn 模型的公式比较逐像素还是逐顶点?逐顶点逐像素综述标准光照模型仅仅是一个经验模型,并不完全复合真实世界中的光照现象。计算光照模型时,需要统一各个方向矢量所在的坐标空间,且方向都是从该点指向其他处的。渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。而光照模型是用于决定原创 2020-06-13 09:42:14 · 380 阅读 · 0 评论 -
【UnityShader】常用的内置变量、函数、语义等
目录UnityCG.cgincUnityCG.cginc中一些常用的结构体常用的帮助函数宏Lighting.cgincUnityShaderVariables.cginc内置变换矩阵Unity内置的摄像机和屏幕参数语义从应用阶段传递模型数据给顶点着色器从顶点着色器传递数据给片元着色器片元着色器输出时Unity支持的语义UnityCG.cginc这里包含了最常使用的帮助函数、宏和结构体。UnityCG.cginc中一些常用的结构体名称描述包含变量appdata_base用于顶点原创 2020-06-13 09:13:02 · 383 阅读 · 1 评论 -
【UnityShader】坐标变换之法线变换
一般来说,点和绝大部分方向矢量都可以使用同一个 4x4 或者 3x3 的变换矩阵把其从坐标空间 A 变换到坐标空间 B中。但变换法线的时候,如果使用同一个变换矩阵,可能无法维持法线的垂直性。如下图所示,在进行非统一缩放时,如果使用和变换顶点相同的变换矩阵来变换法线,就会得到错误的结果,即变换后的法线方向与平面不再垂直 切线是由两个顶点之间的差值计算得到的,因此,可以直接使用用于变换顶点的变换矩阵来变换切线。解释: 坐标空间A中两点 a,b,切线 t,法线 nor。经过变换后在坐标空间 B原创 2020-06-13 08:50:16 · 866 阅读 · 0 评论 -
【UnityShader】坐标空间与坐标变换
坐标空间变换每个坐标空间都是另一个坐标空间的子空间,反过来,每个空间都有一个父坐标空间;对坐标空间的变换实际上就是在父空间和子空间之间点和矢量进行变换;假设现有父坐标空间 P 以及子坐标空间 C,已知在父坐标空间中子坐标空间的原点位置 Oc 以及 3 个单位向量的表示 Xc,Yc,Zc。把子坐标空间下的点或者矢量 Ac(a,b,c) 变换到父坐标空间下 Ap,步骤: 1. 从坐标原点 Oc 开始; 2. 向 Xc 方向移动 a 个单位; 3. 向 Yc 方向移动 b 个单位;原创 2020-06-12 07:49:13 · 533 阅读 · 0 评论 -
【UnityShader】数学基础
总结观察空间(以摄像机为原点的坐标系),Unity使用的是右手坐标系。矢量是指n维空间中一种包含模和方向的有向线段。在Unity中,常规做法是把矢量放在矩阵的右侧,即把矢量转换成列矩阵来进行计算。CBAv = (C(B(Av)) 等价于vATA^TATBTB^TBTCTC^TCT = ((vATA^TATBTB^TBT)CTC^TCT)使用列向量的结果是,阅读顺序是从右到左的,即先对 v 使用A进行变换,再使用B进行变换,最后使用C进行变换。大多数情况下,复合变换约定的顺序是先缩放、在旋转,最原创 2020-06-09 07:34:03 · 226 阅读 · 0 评论 -
【UnityShader】内置变量修饰符、变量、语义、函数等
CG语言中的变量修饰符修饰符解析const变量被定义成常量的话,在程序中,就不能再对该变量赋值,除非const和uniform,varying一起使用。const修饰的变量,需要在声明时给予一个初始值externextern表明声明仅仅是声明,而非定义。在程序中一定有一个地方存在一个非extern的对应的声明in只在声明参数,或是使用varying修饰符时使用。将参数,或是varying作为函数或是程序的输入值。函数参数如果没有in,out,或者inout的话,隐式的原创 2020-05-24 09:11:34 · 638 阅读 · 1 评论 -
【UnityShader】常用函数(数学函数、纹理映射函数)
数学函数函数描述abs(x)返回输入参数的绝对值acos(x)反余切函数,输入参数范围为[-1,1], 返回[0,π]区间的角度值all(x)如果输入参数均不为0,则返回ture; 否则返回flase。&&运算any(x)输入参数只要有其中一个不为0,则返回trueasin(x)反正弦函数,输入参数取值区间为,返回角度值范围为[−π/2,π/2]atan(x)反正切函数,返回角度值范围为[−π/2,π/2]atan2(y,原创 2020-05-23 17:49:13 · 1543 阅读 · 1 评论 -
【UnityShader】Shader基础
文章目录材质Unity ShaderUnity提供了 4 种 Unity Shader 模板ShaderLabUnity Shader在 Inspector 面板中显示的内容Unity Shader 的结构表面着色器顶点/片元着色器材质 材质是一个数据集,主要功能就是给渲染器提供数据和光照算法。Unity Shader Unity Shader 是 Unity 为开发者提供的高层级的渲染抽象层。Unity提供了 4 种 Unity Shader 模板Standard Surface Sha原创 2020-05-23 09:05:27 · 382 阅读 · 0 评论 -
【UnityShader】渲染流水线
渲染流水线综述新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入综述 渲染流水线的最终目是渲染一张二维纹理,...原创 2020-05-17 22:47:17 · 177 阅读 · 0 评论