Unity Shader 详细自学(一)

Shader

这是国外一个很详细的Shader入门基础网址UnityGames
当然国内也有翻译UnityGames翻译
还有就是猫都能学会的Shader入门指南

  • 零基础自学shader,有基础的同学勿喷,楼主最喜欢-- 打破沙锅问到底,杜绝任何一个只是盲区。所以现阶段主要在于shader的理论。我们Unity里面用什么语言编写Shader呢,现在总共有3种语言可以编写Shader代码。
    • Cg(C for Graphic,NVIDIA推出的,已经不更新了)。
    • HLSL(High Level Shading Language,微软的Direct推出,用于win平台,对手:OpenGL)。
    • GLSL(OnpenGL Shading Language,OpenGL推出,对手Direct3D)
    • 然后,因为Microsoft和NVIDIA合作,所以Cg/HLSL实际上是同一种语言
    • ShaderLab语言,这个东西只是为Unity Shader服务的语言,目的就是让shader编程更加简单,但是,Unity为了最大化的跨平台支持,选择重点支持HLSL,在实际使用中很多时候HLSL和CG是一样的。需要嵌套在命令CGPROGRAM和ENDCG之间。还有就是CGINCLUDE(与CGPROGRAM这俩不一样)代码块会被插入到每一个Pass中,因此我们可以把Pass中的公共的字段,结构和方法等声明在CGINCLUDE代码块中。
  • shader中文名叫着色器,顾名思义,它的作用可以先简单理解为给屏幕上的物体画上颜色。而什么东西负责给屏幕上画颜色?当然是GPU,所以我们写shader的目的就是告诉GPU往屏幕怎么画。然后就是一些固定代码结构,比如说Properties是什么,SubShader是什么,Pass等等。当然想要学shader,楼主以为是这样一个过程:
    首先.需要搞懂Shader是干啥的。从基础的开始,shader代码关键字是什么意思,尽管你不知道它能在这个shader里面起到什么作用,比如说这一行:
    在这里插入图片描述
    他是将当前subshader的所有pass的渲染队列设为”Geometry+1“层,为什么要这么设置呢,后面再说。有了这些理论知识,拿到shader代码,至少不会一脸蒙逼。
    其次.不仅仅需要理论知识,看代码是必须的,要知道别人写的这个shader代码是什么意思,有什么作用,这里就不能像前面的知其然不知其所以然了,不仅要知道这句话是什么意思,还要知道为什么要这样写,写了这句话能出来什么效果,所以第二阶段就是读代码。
    最后.准备工作做好了,就需要上手了,从简单的开始写,熟能生巧就可以了。文章中有理解错误的,下面就是第一阶段,请大家多多指教。
  • 在unity中新建一个shader(Stander Surface Shader),然后在vs中打开,代码结构如下:
    在这里插入图片描述
  • 代码解释
    所有shader代码必须由Shader “shader路径” { } 包括在里面.
    上面乱糟糟的代码提取出来是这个样子
  • Properties{…} 指的是本shader定义的属性,类似于C#中的定义int,string等字段,定义自己需要的属性字段,定义属性的格式为:
    _Name (“display name”, 属性类型(type)) = “name” { options } :
    • _Name---------------属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
    • display name ----- Inspector面板显示的名称
    • type ------这个属性的类型有以下几种:
    • Color ------一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
    • 2D ----- 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
    • Rect ----- 一个非2阶数大小的贴图;
    • Cube ----- 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
    • Range(min, max) - 一个介于最小值和最大值之间的浮点数,类似滑动条(比如透明度渲染的截止值可以是从0至1的值等);
    • Float - 任意一个浮点数;
    • Vector - 一个四维数;
    • 提示: 其中每一个类型还可以设置默认值,如下:
      • Color 的默认值 - - 以0~1定义的rgba颜色,比如(1,1,1,1);
      • 2D/Rect/Cube - - 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者"white",“black”,“gray”,“bump”,“red”,"empty string"中的一个,
      • Float,Range - - 某个指定的浮点数
      • Vector - - 一个4维数,写为 (x,y,z,w)
      • 另外还有一个{option},它只对2D/Rect/Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个,这些都是OpenGL中TexGen的模式,
  • SubShader{…} 最基础的解释就到这里,具体怎么用后面会写到。
  • 下一篇写SubShader{…} 的相关基础 Unity Shader 详细自学(二)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值