紫色:大类概念或简短有力的总结
蓝色:细分概念或重要部分
红色:重要的补充注释
第五章:认识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"}//光照标签
}
}
}