Unity中Shader的个人理解



一、概念
材质:shader、贴图、颜色选择、参数
Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出
简单讲:shader:贴图+颜色+参数设定二、分类
(1)表面着色器
(2)片着色器
三、结构
【着色器组成】
1.属性定义:指定代码有哪些输出
2.子着色器:N个子着色器,具体执行哪个有平台决定,这个是代码的主题
3.回滚:用来处理Subshader都不能运行的情况
四、实例讲解

Shader "Custom/Diffuse Texture" {
  Properties {
      _MainTex ("Base (RGB)", 2D) = "white" {}
  }
  SubShader {
      Tags { "RenderType"="Opaque" }
      LOD 200
     
      CGPROGRAM
      #pragma surface surf Lambert

      sampler2D _MainTex;

      struct Input {
          float2 uv_MainTex;
      };

      void surf (Input IN, inout SurfaceOutput o) {
          half4 c = tex2D (_MainTex, IN.uv_MainTex);
          o.Albedo = c.rgb;
          o.Alpha = c.a;
      }
      ENDCG
  }
  FallBack "Diffuse"
}


1:Properties{}:属性定义
   (1)语法定义:_Name("Display Name", type) = defaultValue[{options}]
   (2)例子: _MainTex ("Base (RGB)", 2D) = "white" {}
   (3)_Name:属性的名字,就是个变量,在下面的代码会用到
   (4)Display Name :在在Unity的材质编辑器中作为Shader的使用者可读的内容
   (5)type : 这个属性的类型可以包括(Color ,2D ,Rect ,Cube ,Range(min, max),Float ,Vector )
   (6)defaultValue:定义一个属性的默认值(如果是Color -(1,1,1,1);如果是2D/Rect/Cube -tint颜色的字符串,可以是空字符串或者”white”,”black”,”gray”,”bump”中的一个)
   (7)2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{}
2: SubShader {}:程序主题
3:Tags:表面着色器可以被若干的标签(tags)所修饰,而硬件将通过判定这些标签来决定什么时候调用该着色器。
   (1)告诉系统什么时候调用我们
   (2){ "RenderType"="Opaque" }:渲染非透明物体时调用
   (3){"RenderType"="Transparent"}:含有透明效果的物体时调用
   (4){"IgnoreProjector"="True"}:不被Projectors影响
   (5){"ForceNoShadowCasting"="True"}:从不产生阴影
   (6){"Queue"="xxx"}:指定渲染序列如果你使用Unity做过一些透明和不透明物体的混合的话,很可能已经遇到过不透明物体无法呈现在透明物体之后的情况。这种情况很可能是由于Shader的渲染顺序不正确导致的。Queue指定了物体的渲染顺序
        <1>Background - 最早被调用的渲染,用来渲染天空盒或者背景
        <2>Geometry - 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
        <3>AlphaTest - 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
        <4>Transparent - 以从后往前的顺序渲染透明物体
        <5>Overlay - 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)
4.LOD很简单,它是Level of Detail的缩写
5.CGPROGRAM开始,ENDCG结束
6.#pragma surface surf Lambert
   (1)#pragma surface surfaceFunction lightModel [optionalparams]
   (2)surface - 声明的是一个表面着色器
   (3)surfaceFunction - 着色器代码的方法的名字(下面就会用到这个方法)
   (4)lightModel - 使用的光照模型
7.sampler2D _MainTex:因为前面定义了变量,这里还要在重新定义下,才能在后面使用。(sampler2D就是GLSL中的2D贴图的类型)
8.void surf(){}:这个是要进行处理的方法
    (1)这个方法是已经定义好的,必须这样写才行,参数的类型
 (2)Input IN:是个结构(输入)
 (3)inout SurfaceOutput o:是个结构(输出)
 (4)_MainTex:贴图变量
 (5)uv_MainTex:贴图变量的坐标值
 (6)在计算输出时Shader会多次调用surf函数,每次给入一个贴图上的点坐标,来计算输出
 (7) half4 c = tex2D (_MainTex, IN.uv_MainTex):在一张贴图中对一个点进行采样的方法,返回一个float4
 (8) o.Albedo = c.rgb:并将其颜色的rbg值赋予了输出的像素颜色
 (9)o.Alpha = c.a:将a值赋予透明度

    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值