Shader 编程入门

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

第一节 GPU的渲染过程

 

[展开全文]

第四节看着想睡觉,有编程基础但是没有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之间

[展开全文]

矩阵:是对空间的一种变换,比如从原始坐标变换到屏幕坐标就用到矩阵

矩阵的逆和矩阵的转置相等,则这个矩阵是正交矩阵

//从模型空间到裁剪空间

pos=mul(UNITY_MATRIX_MVP,v.vertex);

MATRIX(矩阵)

MVP(M(model,模型空间),中间还有世界空间,V(view,观察空间),P( Presenter ),协调两者)

[展开全文]

开头:Shader 记录Shader的名字和路径

Properties 包含可以直接操纵的属性

Subshader 主要的内容,Shader的主体

可以有多个,程序会从上往下找,找到第一个能用的后,就不在管其他的了

Cull Back/Front/Off 剔除

Ztest 深度操纵

Zwrite On/Off 远近的渲染顺序,可设置近出的景物遮挡远处的景物

Blend 混合渲染

Tags 渲染标签,指定渲染顺序

Tags { "Queue(队列)"="Transparent(半透明的)"}

在不透明之后渲染

RednerType 着色器的分类

DisableBatching 批处理开关

ForceNoShadowCasting 阴影投射

IgnoreProjector 用于半透明物体不受投射

CanUseSpriteAtlas 用于2D精灵

PreviewType Unity预览用模型

Pass 可以有多个,Subshader中的Pass会依次被执行。在Pass中可以进行渲染的设置,当满足条件的时候执行

LightMode 指定Unity渲染的路径

RequireOptions 渲染这个Pass所需要的条件

在Pass中真正包含了渲染的指令

最后:FallBack 是本Shader中的内容不被支持时,选用Unity默认的低级Shader替换

 

[展开全文]

GPU的渲染流程:

定点着色器:对每一个定点调用定点着色器,计算定点的颜色和进行左边变化

几何着色器:输入点线面等图元数据,生成新的图元

裁剪:裁剪无需渲染的部分, 可以设置

屏幕映射:将坐标映射到屏幕坐标系,不可编程

三角形设置:得到三角形对屏幕像素的覆盖信息

三角形变换:生成片元。对片元内部的像素插值

片元着色器:纹理采样,计算光照结果

逐片元操作:混合和写入像素颜色

[展开全文]

左手坐标系和右手坐标系

unity用的左手坐标系

向量的运算:

  1. 向量相加(交换率)
  2. 点乘A*B =|A|*|B|*COS$  把向量变为长度为1的函数normalize(A)
  3. 叉乘 

矩阵:

定义矩阵:A=[1,1,1;1,1,0;1,0,0] ==

A=  1  1  1  三行三列

   1  1  0 

   1  0  0

B=[1,2,3]==

B=  1  2  3 一行3列

A*B不成立

B*A成立 = 6  3  1

6=1*1+2*1+3*1(B的第一行行乘A的第一列列)

矩阵乘法:前一项的列数=后一项的行数才能相乘。1*3 能与3*3运算 =1*3

单位矩阵:对角线都是1的矩阵

矩阵的转置:

A =  1   1  1

    5   1  0

    1   0  0

=>A= 1  5  1

   1  1  0

   1  0  0

矩阵的逆

正交矩阵=(矩阵的转置=矩阵的逆就是正交矩阵)

矩阵的意义和齐次矩阵

  1. 平移矩阵(对点进行平移对向量没有意义)
  2. 缩放矩阵
  3. 旋转矩阵

图形学中的意义:

从模型空间到裁剪空间

[展开全文]

GPU的渲染流程:

max命令:Edt Normals(法线显示命令)

去掉物体表面的光滑组,法线显示每个点有4根线,用于不平滑的客观需求;

渲染流程:

应用阶段=》几何阶段=》光栅化阶段

DrawCall 越高,配置需求越高,游戏越卡

 

顶点着色器-集合着色器-裁剪-屏幕映射-三角形变化-三角形变幻-偏远着色器-逐片元操作

 

 

[展开全文]

1.着色器背后机制 (gpu的渲染流程)

shader:告诉gpu如何计算

[展开全文]

float 32 

half 16

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

[展开全文]

1.gpu 渲染流程

法线 

模型0-数据 、、、、

 

[展开全文]

(1)渲染状态设置:Cull Back/Front/Off(背面剔除,正面剔除,不剔除)

(2)Ztest Less Greater/LEqual/GEqual/GEqual/Always(检测像素在Z轴的深度进行处理

(3) Zwrite On/Off 打开之后摄像机近处的像素会遮挡后面的像素。

(4)Blend 

 (5) 标签设置(指定队列渲染顺序)

     Tags{"Queue" = "Transparent"}

 (6) Queue 渲染顺序指定

     Rendertype 着色器分类

     DisableBatching 批处理开关

     ForceNoShadowCasting 阴影投射

     IgnoreProjector 用于半透明物体不受投射

     CanUseSpriteAtlas 用于2D精灵

     PreviewType Unity 预览用模型

(5)SubShader中的Pass会依次被执行

  Pass可以自定义命名(例如),如果别的地方要使用其中的shader中的需要声明:UsePass"MyShader/MYPASS"

 (6)SubShader中的渲染设置也可以用于Pass

Pass中的Tags:

LightMode  指定Unity中渲染路径

RequireOptions 渲染这个Pass需要的条件

(6)Subshader与Pass中包含的是最重要的渲染细节信息

Vertex Shader  顶点着色器

Fragment Shader 片段着色器

Surface Shader unity自带的shader

(7)FallBack是本Shader中的内容不被支持时,选用那种低级的shader替换

 FallBack "ShaderName"

[展开全文]

Shader "Lesson02/SimpleDifuse"
{
    Properties
    {
       _Diffuse("DiffuseColor",Color) = (1,1,1,1)
    }

      _ValveIndex("ValveIndex",(0.0,1.0)) = 0.5
    //声明
    SubShader
    {
    Pass
    {
    Tags{"LightMode" = "ForwardBase"}
    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 worldNormal :TEXCOORO;
    };

    v2f vert(a2v v)
    {
    v2f o;
    o.Pos = mul(UNITY_MATRIX_MVP,v.vertex);//从模型控件变化
    o.worldNormal  = normalize(mul(unity_ObjectToWorld,v.normal));//顶点法线从模型空间变换到世界空间。
   
    return o;
    }
    fixed4 frag(v2f IN): SV_TARGET{

     float3 lDir = normalize(_WorldSpaceLightPos0.xyz);
    fixed3 diffuse = _LightColor0 * _Diffuse * max(dot(IN.worldNormal,lDir)*_ValveIndex+(1.0 - ValveIndex));//数值保证在0-1之间
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
    o.color = ambient + diffuse;//ambient 指的是环境光,颜色相加
    return fixed4(IN.color,1.0);
    }
    ENDCG
    }
    }
}

[展开全文]

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中处理单个逐像素光源

 

 

 

[展开全文]

Shade(着色器)

GPU渲染流程

三维模型渲染

[展开全文]

授课教师

课程特色

视频(7)

学员动态

Child 开始学习 GPU的渲染流程
Child 加入学习
wgcode 加入学习