Shader 编程入门

默认教学计划
5991人加入学习
(29人评价)
价格 免费
教学计划
会员免费学 加入学习

第四节看着想睡觉,有编程基础但是没有shader基础看的一脸懵逼

[展开全文]

第一行 路径名

第二行  声明一个Properties

声明一个Diffuse的变量,

第三行 SubShader

Pass

 

 

[展开全文]

漫反射:物体表面比较粗糙,反射没有规律,从各个角度看物体颜色相同。

好处:(1)view视角不相干,不用计算摄像机视角

Shader中常用类型

float(32bit)half(16bit)

fixed(11bit):color[0,1]

POSITION :GPU在哪里去存储数据

SV_POSITION,SV_TARGET

nDir=normalzie(mul((float3*3)_Object2World,v.normal))//顶点法线从模型空间变换到世界空间

lDir=normalize(_WorldSpaceLightPos0.xyz)//用于平行光

ambient(环境光)=UNITY_LIGHTMODEL_AMBIENT.xyz

diffuse=_LightColor0(环境光)*_Diffuse(用户自定义颜色)*saturate(dot(nDir(法线方向),lDir))//saturate将数值框定在0到1之间

[展开全文]

float 32 

half 16

fixed 11位 精度最低,速度最快

[展开全文]

Shader "Lesson/SimpleDifuse"
{
    Properties
    {
       _Diffuse("DiffuseColor",Color) = (1,1,1,1)
    }
    //声明
    SubShader
    {
    Pass
    {
    CGPROGRAM
    #pragma vertex vert//顶点函数
    #pragma fragment frag//片段函数
    #include "Lighting.cginc"
    fixed4 _Diffuse;

    struct a2v 
    {
    float4 vertex:POSITION;//POSITION:语义:GPU在哪里存取数据,
    float3 normal:NORMAL;
    };

    struct v2f
    {
    float4 Pos:SV_POSITION;
    fixed3 color:COLOR;
    };

    v2f vert(a2v v)
    {
    v2f o;//顶点三维坐标
    o.Pos = mul(UNITY_MATRIX_MVP,v.vertex);//从模型空间到数据空间
    float3 nDir = normalize(mul(unity_ObjectToWorld,v.normal));//顶点法线从模型空间变换到世界空间。
    float3 lDir = normalize(_WorldSpaceLightPos0.xyz);//用于平行光


    fixed3 diffuse = _LightColor0 * _Diffuse * saturate(dot(nDir,lDir));//数值保证在0-1之间
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//计算ambient的值
    o.color = ambient + diffuse;//ambient 指的是环境光,颜色相加
    return o;
    }
    fixed4 frag(v2f IN): SV_TARGET{
    return fixed4(IN.color,1.0);
    }
    ENDCG
    }
    }
}

//..前向渲染(处理方式,由高到低)

1.逐像素处理(per-pixel)

2.逐顶点处理(per-vertex)

3.SH简化处理

//光源处理方式的决定

RenderMode设置为Not important的为逐顶点或SH处理

RenderMode设置为Important的为逐像素处理

在QualitySetting中可以设置逐像素处理数目

逐顶点处理光源最多4个

在FowardBase Pass中,处理一个逐像素光源和全部的SH/逐顶点光源

在ForwardAddPass中处理单个逐像素光源

 

 

 

[展开全文]

语义:GPU在哪里去存取数据

[展开全文]

三种变量

float 32bitt 

half 16bit

fixed 11bit速度最快 位数最低

一般用于颜色值的时候 color fixed效率最高

Shader "Custom/xx"

properties{

 

_Diffuse("DiffuseColor",Color)=(1,1,1,)

}

SubShader{

Pass{

CGPROGRAM

#pragam vertex vert

#pragm fragment frag

#include"Lighting.cginc"//引用库

fixed4 _Diffuse

struct a2v{

float4 vertex:POSITION//GUP在那里存取数据

float3 normal:NORMAL;

}

struct v2f{

fixed4 worldPos:SV_POSITION//

fixed3 color:Color;

}

v2f vert(a2v v){

v2f o;

o.pos=mul(UNITY_MAXTRIX_MVP,v.vertex)

float nDir=mul((float3*3)_Object2Worlf,v.normal)

float3 1Dir=normalize(WorldSpaceLightPos0.xyz)///用于平行光

//顶点法线从模型空间变换澄世界空间

//从模型控件变化到裁剪空间

fixed3 diffuse=_LightColor0* _Diffuse*satuate(dot(ndir,1dir))

//数值保证在0-1 不会出现负值

fixed3 ambient =UNITY_LIGHTMODEL_AMBINENT.XYZ

 

 

o.color=ambient+diffuse

 

//3 4代表的是有几位的向量

 

//anbient 指的环境光 颜色叠加

 

}

 

 

 

ENDCG

}

 

 

}

[展开全文]