我之前的写过一个关于渲染流水线,接下来聊聊shader。
shader的数据类型和c#是有一些相似的,我下面的Properties里面写了几个类型(这个函数里面写的类型都会在unity里面以显示的形式展现出来,下面一个图片就是在unity界面里面所展示的一个效果),只是列举了几个常用的类型。然后它还有一些其他的类型,我写在Pass函数里面,因为这些类型是不去显示的。
首先在unity里面定义一个shader,在Proect中右键选择Shader下的StandardSurfaceShader这个shader是基本的shader框架,其他的几个都是不同的shader框架,所有我们选择基本就可以。
shader有两个必须有的函数Properties只能定义一个,它是用来和用户进行一个交互方式存在,可以显示在Inspector里面,让用户进行选择以及设置一些值,还有一个是SubShader,这个函数可以定义很多个,但一般情况下是只用一个,如果定义多个的情况下就是当前显卡不支持第一个SubShader,然后一次筛选后面的SubShader选择当前电脑显卡所支持的SubShader。然后还会有一个备用的显示方式–Fallback “VertexLit”。我在下面也加了备注,这是一种后备方案。

Shader "MyShaderOne"
{//属性块只能有一个Properties{_Color("color",Color)=(1,1,1,1)//float4_Verctor("Verctor",Vector)=(1,2,3,4)//float4_Int("Int",Int)=123//float_Float("Float",Float)=4.5//float_Range("Range",Range(1,20))=5//Range(1,20)这是一个定义范围--float_2D("Texture",2D)="white"{}//"white" 的作用的当我们不指定图片会默认使用白色--sampler2D_Cube("Cube",Cube)="while"{}//可以指定一个图片形成的效果是一个立方体的天空盒--samplerCube_3D("Texure",3D)="black"{}//--sampler3D}//subshader可以有很多个//它会分以不同的显卡用不同的subshader//当发现当前显卡不能支持当前的subshader会运行下一个subshaderSubShader{//pass块相当于方法--可以有很多个,但一般只用一个Pass{//在这里可以直接编写shader代码CGPROGRAM//使用cg语言编写代码//float  half  fixed------float4  float3  float2  float //float 是32位存储 //half 是16位 -6万到6万//fixed 是11位 -2到2float4 _Color;float4 _Vector;float _Int;float _Range;sampler2D _2D;samplerCube _Cube;sampler3D _3D;ENDCG}}//后备方案,当上面的subshader都不能执行的时候执行此Fallback "VertexLit"
}


上面对shader的一些基本数据有了一个了解之后我们再了解一下必须要有的两个函数(#pragma vertex vert)、(#pragma fragment frag)这两个是必须要定义的,它们是进行一些shader功能的必要函数,在vertex 中会进行定点函数的处理,就是对于买一个定点数据的处理,fragment 是对于片元的处理,可以参考渲染流水线的几何阶段。
在函数定义的方法里面,有人会想玩什么会加一个:还有后面的参数名是个什么意思,首先我们第一个函数(float4 vert(float4 v:POSITION) :SV_POSITION)POSITION他是一个宏,相当于将物体的数据传入函数中变成float4 v的参数,然后括号后面的SV_POSITION是类似以返回值,在前面将参数获取到之后得返回回去,不然我们获取、计算值就没有什么意义,所以在函数定义前面会加一个float4,这个相当于c#中定义函数会写一个返回值类型意义下面这个函数。
下面这个函数中SV_Target 也是一样的,将片元的参数返回到物体中,让物体显示出来。在下面我们返回了一个float4的值,物体就会将这个值进行转换成颜色,然后显示出来,这个参数会显示出来下面这个物体的颜色。

Shader "MyShaderTwo"
{SubShader{//pass块相当于方法--可以有很多个,但一般只用一个Pass{CGPROGRAM//基本作用 完成顶点坐标从模型看见到裁剪空间的转换(从游戏环境转到视野相机屏幕)//定点函数 这里只是声明了,定点函数的函数名
#pragma vertex vert//基本作用 返回模型对应的屏幕上的每一个像素的颜色值//片元函数 这里只是声明了,片元函数的函数名
#pragma fragment frag//position是一种语义好让函数知道数据的来源括号后面的语义是给数据来源做语义通过语义告诉系统我这个参数是什么的float4 vert(float4 v:POSITION) :SV_POSITION {//通过这个宏就可以将模型空间转到剪裁空间(float4类型)return UnityObjectToClipPos(v);}float4 frag() : SV_Target {return float4(0.5,0.5,1,1);}ENDCG}}Fallback "VertexLit"
}


然后会有人想之前说的Properties为什么一直没有用,因为上面只是对shader让你有一个基本的了解,得有金刚钻才能揽瓷器活。所以在写shader之前,要先将框架有一个基本的了解,以及知道每一个步骤是干什么的,为什么要这么定义,以及一些必要的宏的使用方法。
当了解了框架之后我们来了解一下基本的逻辑处理。

Shader "MyShaderFour"
{Properties{_Diffuse("Diffuse Color",Color) = (1,1,1,1)}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM//获取第一个直射光的颜色 _LightColor0 第一个直射光的位置_WorldSpaceLightPos0#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Diffuse;//application to vertex从应用传递到顶点struct a2v {float4 vertex:POSITION;//告诉unity把模型空间下的顶点坐标填充给vertexfloat3 normal:NORMAL;};//SV_POSITION是必须有的没有的话就不会显示出物体的模型struct v2f {float4 position:SV_POSITION;fixed3 color : COLOR;};//用结构体返回值可以返回多个值,对后面的一些操作有帮助//系统自动调用,会给屏幕上的每一个顶点调用v2f vert(a2v v){v2f f;f.position = UnityObjectToClipPos(v.vertex);fixed3 normalDir = normalize( mul(v.normal,(float3x3) unity_WorldToObject));//3x3是shader的一个表示方式,可以将数据转换成3x3fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//获取到场景中灯光的位置fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0)*_Diffuse.rgb;//获取漫反射颜色--_Diffuse.rgb是之前定义的_Diffuse的值f.color = diffuse; return f;}//系统自动调用,会模型所对应在屏幕上的像素点对应--调用的多fixed4 frag(v2f f): SV_Target {return float4(f.color,1);}ENDCG}}Fallback "VertexLit"
}

上面我所写的这个函数就是对shader的一个基础的编写,首先Properties中定义的是一个对于颜色的修改,在我们的Inspector里面会出现下面这个图片中红框所标记的。
然后下面(Tags{“LightMode” = “ForwardBase”})与(#include “Lighting.cginc”)是获取场景中直射光的数据在后面的函数中科院使用。在Properties中定义的_Diffuse需要在Pass里面定义一个(fixed4 _Diffuse;)才可能在线面的函数中使用,不然会报错。然后定义了(a2v)函数和(v2f)函数是通过这两个函数进行传值的一些操作,用函数会比直接传值增加效率。
对于定点函数(vert)中的一些方法具体是干什么的,我在函数里面也做了相对应的注释,在最后(f.color = diffuse; )就是将值进行一个赋值可以使这个值在下面的片元函数(frag)中使用。
在片元函数中会有人想一个float4的值为什么float3的值也可以用,还有(f.color)后面的,1是干什么的,其实在上面我们定义的(f.color)是一个现对于unity中(Vector3)的一个参数,但我们在Properties中定义的(_Diffuse)是一个float4的值相当于unity中(Quaternion)是有四个参数的,所以我们在(f.color)后面加了一个(,1)是补全他们所相差的一个参数值。
上述所说三个基本案例只是对shader的一个基本了解,仅限于入门,shader更重要的对于数学的一个逻辑思维能力,以及算法的研究,对于定点函数以及片元函数而言,片元函数所执行的次数会更多。

unityShader入门了解相关推荐

  1. 《UnityShader入门精要》总结(1)理论篇

    紫色:大类概念或简短有力的总结 蓝色:细分概念或重要部分 红色:重要的补充注释 第二章:渲染流程与流程分工 渲染的流程分三个阶段: 应用阶段(开发者控制阶段) 由开发者全权进行管理,控制场景内摄像机位 ...

  2. UnityShader入门精要-3.3 UnityShader的结构

    一个UnityShader的基础结构如下所示: Shader "ShaderName"{Properties{//属性 } SubShader{//显卡A使用的子着色器 }SubS ...

  3. UnityShader入门精要笔记1——顶点/片元着色器结构与BRDF(基本光照模型)——实现漫反射

    文章目录 BRDF(基本光照模型) 实现漫反射 光线强度的计算 好现在开始写Shader 新建Shader 添加一个Properties语义块 添加SubShader和Pass. 使用CG/HLSL语 ...

  4. UnityShader入门精要-9

    目录 1. Unity的渲染路径 前向渲染路径 Unity中的前向渲染 延迟渲染 Unity的光源类型 Unity的光照衰减 Unity的阴影 1. Unity的渲染路径 Unity 5.0之前,有3 ...

  5. UnityShader入门精要——运动模糊

    运动模糊是真实世界中的摄像机的一种效果.如果在摄像机曝光时,拍摄场景发生了变化,就会产生模糊的画面. 运动模糊的实现有多种方法.一种实现方法是利用一块累积缓存(accumulation buffer ...

  6. UnityShader入门精要——运动模糊(2)

    本次利用速度映射图方法实现运动模糊.速度映射图中存储了每个像素的速度,然后使用这个速度来决定模糊的方向和大小. 速度缓冲生成的方法: (1)把场景中所有物体的速度渲染到一张纹理中.但这种方法的缺点在于 ...

  7. [学习笔记]UnityShader入门精要_第12章_屏幕后处理效果

    12.2 调整屏幕的亮度,饱和度和对比度 C# CheckShaderAndCreateMaterial Range OnRenderImage Material.SetFloat Graphics ...

  8. UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊

    (从这里开始可能会记录的更简略一些,时间紧张想迅速读完这本书的主要内容,可能有的部分不会自己上手做) 屏幕后处理通常指渲染完整个场景得到屏幕图像后,再对图像进行操作,抓取屏幕可以使用OnRenderI ...

  9. [UnityShader入门精要读书笔记]37.水波效果

    在这里,使用一张立方体纹理(cubemap)作为环境纹理,模拟反射.为了模拟折射效果,我们使用GrabPass来获取当前屏幕的渲染纹理,并使用切线空间下的法线方向对像素的屏幕坐标进行偏移,再使用该坐标 ...

最新文章

  1. PyTorch迁移学习
  2. windows系统如何添加ssh key到github
  3. C指针原理(42)-内存管理与控制
  4. tcl是华为鸿蒙受益者吗,在三星华为都很成功的杨柘 为什么却栽在了TCL?
  5. mybatis mapper文件找不到_MyBatis 面试题
  6. 8.String、StringBuffer、enum枚举
  7. .net 多个dll 封装成一个dll_C#封装YOLOv4算法进行目标检测
  8. Part Five 音视频API
  9. 去除maven父依赖_如何在Maven中从父项目中排除依赖项?
  10. 在linux系统中下载thchs30,aishell数据处理为thchs30格式
  11. 【LOJ】#2532. 「CQOI2018」社交网络
  12. Linux网络服务_dhcp服务和dhcp中继服务
  13. jquery中的过滤filter not的用法以及可以添加this
  14. 烂泥:学习ssh之ssh隧道应用
  15. 《创新者的窘境》读书笔记
  16. mysql主键和候选键有什么区别?
  17. 苹果亮度自动调节怎么关闭_Redmi K30 Pro自动亮度调节和iPhone基本一致,安卓手机的大进步...
  18. 利用账号密码模拟登录新浪微博
  19. 基于Yahoo网站性能优化的34条军规及自己的见解
  20. 腾讯优图实验室招聘计算机视觉研究员和实习生

热门文章

  1. 云服务 IaaS、PaaS、SaaS
  2. Ubuntu-查看ubuntu系统的版本信息
  3. EOS智能合约开发系列(二)
  4. 文件上传控件-如何上传文件-大文件断点续传
  5. 排序算法(插入、选择、交换、归并)
  6. 【Day35 文献精读】Causal contribution of primate auditory cortex to auditory perceptual decision-making
  7. Fiddler抓包配置和使用(全网最详细教程)
  8. 【安装与运行】IROS2020:Remove, then Revert - 基于多分辨率深度图的动态物体移除方法
  9. 下载网页所有图片的最简单的方法
  10. 从永远到永远-Navicat将MySQL数据库复制到另一个Mysql数据库