《UnityShader入门精要》总结(2):初级篇

紫色:大类概念或简短有力的总结

蓝色:细分概念或重要部分

红色:重要的补充注释

第五章:认识UnityShader

从一个最简单的着色器结构说起

一个包含了顶点着色器和片元着色器的基本代码 

#pragma 定义了着色器类型

vertex为顶点,fragment为片元 (shader使用的是CG语法)

其中的Fixed4,float4等都代表了什么?

看一个进阶版的将顶点和片元着色器联动的代码

 

冒号后面是语义,从应用阶段传递模型数据给着色器使用的规定好的方法

如果觉得比较绕.可以暂时将冒号当做"来自于"理解

常用语义:

float4 vertex : POSITION

比如创建了一个float4变量vertex,其来自于POSITION(模型空间顶点坐标) 

这次vert返回了一个v2f结构而非float4了.并且最后frag也成功引用了v2f完成着色

(vertex.normal是法线)

调用属性

属性就是在编辑器界面可更改的变量。使用Properties

 直接在着色器中引用

这样,一个颜色可随时调节的shader就做好了

第六章:Unity中的光照

摄像机中的场景是如何实现的?

一、环境光

就如同人眼通过光来观察世界一样

当光照射在场景的物体上之后,进入摄像机的光就是我们能看到的物体模型

这是一个白色的cube

但是我们看到他三个面分别是白色,灰色,黑色

这是因为上面的太阳光只打到了cube的上半部分

现在,我们给了一个蓝色的太阳光

现在虽然物体是白色的(在Scene视图)。但是从游戏摄像机看到的cube是蓝色的(因为反射的光是蓝色的)

像这样使用全局光源使物体获得光照,我们称之为环境光

自发光

物体本身发光来直接进入摄像机

附自发光只

需要在片元着色器输出颜色之前添加自发光颜色到输出颜色上

漫反射

漫反射公式:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Light_3"
{
  ProPerties 
  {
  _Diffuse("Diffuse" , Color)=(1,1,1,1)  
  }
  SubShader
  {
    Pass
    {
      CGPROGRAM
      #include "Lighting.cginc"
      fixed4 _Diffuse;
      #pragma vertex vert//顶点
      #pragma fragment frag //片元
      
      struct a2v
      {
        float4 vertex:POSITION ;
        float3 normal : NORMAL;
      };
      struct v2f
        {
          float4 pos: SV_POSITION;
          fixed3 color : COLOR;
        };
//
      v2f vert(a2v v)
      {
        v2f o;
        o.pos=UnityObjectToClipPos(v.vertex);
        fixed3 worldNormal=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
        //normalize:归一化,避免坐标系不同而导致预期不符
        fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
        fixed3 diffuse =unity_LightColor0.rgb* _Diffuse.rgb *
          saturate(dot(worldNormal,worldLight));
        //光照强度*漫反射係數
        //点积反馈了法线渔光照的方向
        o.color=UNITY_LIGHTMODEL_AMBIENT.xyz+diffuse;
        //返回环境光+漫反射
        return o;
      }
      fixed4 frag (v2f v):SV_Target
      {
      return fixed4 (v.color,1.0);
      }
      ENDCG
      Tags{"LightMode"="ForwardBase"}//光照标签
    }    
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值