Unity shader学习之反射】的更多相关文章

shader如下: Shader "Custom/Reflection" { Properties { _Cubemap("Cubemap", Cube) = "" {} _ReflectionAmount(, )) = 0.5 } SubShader { Pass { Tags { "LightMode" = "ForwardBase" } Cull Off CGPROGRAM #pragma verte…
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GPU 加速计算? 1.1Draw Call CPU过Draw Call来g告诉GPU开始一个渲染过程.一个Draw Call会指向本次调用需要渲染的图元列表. 通俗的讲我们可以把CPU理解成一群专家,他们有着超强和快速的计算能力,能解决各种各样的问题.GPU则是许许多多个流水线上的工人,尽管它们只能做…
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 一.工作原理 sureface表面着色器相当于unity在顶点片元着色器的基础上进一步的封装.当我们定义一个“surface function”后,可以通过unity已经封装好的的结构体“SurfaceOutput”等直接获取需要的数据,如纹理,法线,光滑度等 二.结构体 2.1标准output结…
1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Texture-Mapping Coordinates)存储在每个顶点上.纹理映射坐标定义了该顶点在纹理中的2D坐标. 纹理映射坐标通常是2维坐标(u,v).也被称为UV坐标.(u为横向,v为纵向) 顶点UV坐标通常被归一化到(0, 1)范围内,但纹理采样的时候常常也有不在(0,1)范围内的坐标. Op…
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubShader Pass { //设置渲染状态和标签 //开始CG代码片段 CGPROGRAM //该代码的预编译指令,例如: #pragma vertex vert #pragma fragment frag //CG代码写在这儿 ENDCG //其他设置 } } SubShader { //针对显卡B的SubSh…
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 如何定义复杂的变量类型 1. 强大的援手:Unity提供的内置文件和变量 上面,我们讲述了如何在Unity中编写一个基本的顶点/片元着色器的过程.顶点/片元着色器的复杂之处在于,很多事情都要我们"亲力亲为",例如我们需要自己转换法线方向,自己处理光照.阴影等.为了方便开发者的编码过程,Un…
1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity Shader的基本结构.它包含了Shader.Properties.SubShader.Fallback等语义块.顶点/片元着色器的结构与之大体类似,它的结构如下: Shader "MyShaderName"{ //属性 } SubShader{ //针对显卡A的SubShader Pas…
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大渲染测试 混合 CPU.GPU.图形接口和驱动的关系 CPU和GPU之间的通信 CPU和GPU并行工作的秘密:命令缓冲区 显示流畅的方法 着色器语言 ShaderLab Shader选用 顶点片元着色器 Unlit Shader 结构 一个简单的Shader 库文件 调试 注意点 3D数学 空间 渲…
纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因为我们使用的实际上是一个一维纹理: 所以在片元着色器中,我们使用fixed2(halfLambert, halfLambert)作为uv坐标进行纹理采样. 代码实现如下: Shader "Unity Shader Book/Chapter 7/RampTexture" { Properti…
高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加为1,因此e前面的系数实际不会对结果产生任何影响. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7238032.html 综上,公式简化为: G(x,y) = e-(x*x+y*y)/2 因此,高斯核计算代码如下: using System; namesp…
1.原理 1.1.Phong模型 计算高光反射需要表面法线.视角方向.光源方向.反射方向等. 在这四个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量(反射方向r)可以通过其他信息计算得到: 这样,我们就可以利用Phong模型来计算高光反射的部分: m(gloss)是材质的光泽度,也被反称为反光度.它用于控制高光区域的"亮点"有多宽,m(gloss)越大,亮点就越小. m(spscular)是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色. c(light)则是…
高光反射光照模型的公式如下: Cspecular = Clight * mspecular * max(0, dot(v, r))gloss 要计算高光反射需要知道4个参数:入射光线颜色Cspecular,材质高光反射系数gloss,视角方向v和反射方向r. 其中r可由cg函数reflect(i, n)求得. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7088297.html 逐顶点高光反射shader如下: Shader "Custom/Specu…
公式如下: Cdiffuse = Clight * mdiffuse * max(0, dot(n,l)); 其中,n 为表面法线,l 为指向光源的单位向量,mdiffuse 为材质温反射颜色,Cdiffuse 为光源颜色. 需要注意的是,需要防止法线与光源方向点积为负,因些使用max函数. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7068273.html shader如下: Shader "Custom/Diffuse Vertex-Level&…
1. 程序员的烦恼:Debug 调试(debug),大概是所有程序员的噩梦.而不幸的是,对一个Shader进行调试更是噩梦中的噩梦.这也是造成Shader难写的原因之一--如果发现得到的效果不对,我们就可能花非常多的时间来找到问题所在.造成这种现状的原因就是在Shader中可以选择的调试方法非常有限,甚至连简单的输出都不行. 2. 最新利器:帧调试器 Unity5除了带来全新的UI系统外,还为我们带来了一个新的针对渲染的调试器--帧调试器(Frame Debugger).与其它调试工具的复杂性相…
1 高度纹理 使用一张纹理改变物体表面法线,为模型提供更多细节. 有两种主要方法: 1.高度映射:使用一张高度纹理(height map)来模拟表面位移(displacement).得到一个修改后的法线值. 2.法线映射:使用一张法线纹理直接存储表面法线. 1.1 高度纹理 高度图中存储的是强度值(intensity).越浅越说明向外凸起,越深越向里凹. 缺点是计算复杂,消耗性能. 高度图也会与法线映射一起使用.给出表面凹凸的额外信息. 1.2 法线纹理 法线纹理中存储的是法线方向.法线方向的范…
Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063.html 如代码如下: 基类: using UnityEngine; [RequireComponent(typeof(Camera))] public abstract class PostEffectRenderer : GameBehaviour { protected abstract s…
菲涅尔反射(Fresnel reflection),指光线照射物体表面时,一部分发生反射,一部分进入物体内部发生折射或散射,被反射的光和折射光之间存在一定的比率. 2个公式: 1. Schlick 菲涅耳近似等式: FSchlick(v, n) = F0 + (1 - F0)(1 - dot(v, n))5 其中F0是一个反射系数,用于控制菲涅尔反射的强度,v 是视角方向, n 是表面法线. 2. Empricial 菲涅耳近似等式: FEmpricial(v, n) = max(0, min(…
使用unity AutoLight.cginc文件里的内置函数 UNITY_LIGHT_ATTENUATION shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Forward Rendering" { Properties { _MainTex("Main Texture", 2D) = "…
Unity阴影采用的是 shadow map 的技术,即把摄像机放到光源位置上,看不到的地方就有阴影. 前向渲染中,若一光源开启了阴影,Unity会计算它的阴影映射纹理(shadow map),它其实是一张深度图,记录了从光源位置出发,能看到的场景中距离它最近的表面位置的深度信息. Unity中采用LightMode为ShadowCaster的Pass来生成这张 shadow map,首先会从本shader中找这个pass,若没有就从fallback的shader中层层寻找. 然后在fragme…
可以在fragment中使用cg的函数--clip来进行透明度测试. 函数定义如下: void clip(float4 x); void clip(float3 x); void clip(float2 x); void clip(float1 x); void clip(float x); 参数:裁剪时使用的标量或矢量条件. 描述:如果给定参数的任何一个分量是负数,就会舍弃当前像素的输出颜色.等同于: void clip(float4 x) { )) discard; } 转载请注明出处:ht…
什么是遮罩? 遮罩允许我们可以保护某些区域,使它们奂于某些修改. 例如下面的例子,使用遮罩来控制高光反射. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7149182.html 使用的贴图,法线,遮罩纹理如下: shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Mask Texture&q…
Blinn-Phong光照模型不用计算反射方向,计算公式如下: h = normalize(v + l); Cspecular = Clight * mspecular * pow(max(0, dot(n, h), gloss)) 转载请注明出处:http://www.cnblogs.com/jietian331/p/7097201.html shader如下: Shader "Custom/Specular Blinn-Phong" { Properties { _Diffuse…
半兰伯特光照模型,为Valve公司在开发游戏<半条命>时提出的一种技术,用于解决漫反射光无法到达区域无任凭明暗变化,丢失模型细节表现的问题. 其公式如下: Cdiffuse = Clight * mdiffuse * ( dot(n, l) * 0.5 +0.5 ) 通过这样的方式,将dot(n, l)的结果从[-1,1]映射到[0,1]的范围. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7083289.html shader如下: Shader…
shader如下: Shader "Custom/Diffuse Fragment-Level" { Properties { _Diffuse (,,,) } SubShader { Tags { "RenderType"="Opaque" } LOD Pass { Tags { "LightMode"="ForwardBase" } // 只有设置了正确的LightMode,才能访问一些Unity提供的…
这个泡沫效果来自远古时代的Unity官方海岛Demo, 原效果直接复制3个材质球在js脚本中做UV动画偏移,这里尝试在shader中做动画并且一个pass中完成: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' //岸边浪花泡沫 //CloudLty 2016-9-6 Shader "Custom/foams2" { Properties//标记所以外部变量,让该变量按…
1.先来一段单张纹理贴图的shader示例代码: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/MyShader"{ Properties{ //外部可调属性 _MainTex ("Main Tex", 2D) = "white" {} } SubShader { //设置使用本Subshader所…
在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律. Valve公司在开发半条命的时候提出了半兰伯特光照模型. 半兰伯特光照模型没有使用max操作来防止n和I的点积为负值,而是对其结果进行了一个α 倍的缩放再加上一个β 大小的偏移. 绝大多数情况下,α 和β的值均为0.5,即公式为: 对于模型的背光面,在漫反射模型中点积结果将映射到同一个值,即0值…
本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 _Diffuse ("Diffuse", Color) = (1, 1, 1, 1) } 在SubShader语义块中定义一个Pass语义块. 在Pass的第一行指明光照模式. Tags{"LightMode" = "ForwardBase"} 在P…
这里使用一种更高效地从深度纹理中重建世界坐标的方法. 首先计算摄像机的视锥体的四条射线向量进行线性插值,插值后的值便是该像素在世界空间坐标下到摄像机的方向. 然后通过与深度值相乘即可得到摄像机位置到该像素的向量,加上摄像机的位置则是该像素在世界空间中的位置. 转载请注明出处:https://www.cnblogs.com/jietian331/p/9443343.html c#代码: using UnityEngine; public class HighFog2 : PostEffectRen…
将物体描一层边可以使游戏看起来具有卡通风格,一种简单的实现方法如下: 将物体渲染2次,即使用2个通道. 第一个通道将顶点沿法线(或中心点到顶点的方向)做一个偏移,即将模型扩大一点,并将颜色渲染成轮廓的颜色. 第二个通道正常渲染物体. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7814894.html 效果如下: shader如下: Shader "Custom/Study/Simple Outline" { Properties { _Ma…