前言
之前学过一段时间的shader,但是是从看视频学的,这样会导致基础知识不牢固,看了,就是看了而已,不从理解上去学习,
终究只是短时的记忆而已,很容易就忘记,因为基础知识的学习,就显得更加重要了,以前实现shader需求,都是从网上抄抄shader,随便改改,也没有去理解每个实现的意义,结果就是知识上并没有长进;因此呢,打算实打实的从基础开始,巩固巩固;从理解上去学习新知识;好好啃书… 此篇作为自己的学习笔记;
概念渲染流水线:
需要经历四大阶段:
应用阶段,几何阶段,光栅阶段,测试阶段
测试阶段分为 模板测试,深度测试
概念流水线的完整描述
在ShaderLab中的关系
应用阶段相对于shaderlba里的 a2v (applydata to vertex);
指的是传递给顶点着色器的 模型的应用数据;
几何阶段相对于shaderlab里的 vertex;
光栅化阶段相对于 shaderlab里的 frament;
关于Shader中应用阶段中数据:
模型空间下的 顶点信息,法线信息,切线信息,纹理信息等等....
Unity里有给内置的Struct appdata_full,它可以用于顶点着色器的输入;
它是Unity的内置 cginc文件,路径在 Editor\2018.1.9f2\Editor\Data\CGIncludes下,
下,可以看到很多内置的CG 文件;
中文完整解释
截图取的是UnityShader入门精要
以下的数据可以作为 应用数据 传递给 顶点着色器,作为 顶点着色器的输入;
CPU与GPU之间的通信:
GPU流水线
Unity ShaderLab 结构
Shader "Custom/SpecularVertexLevel" {
Properties {
}
SubShader {
Tags{"xxx"="xxx"}
pass
{
Tags{"xxx"="xxx"}
CGPROGRAM
ENDCG
}
}
FallBack "Diffuse"
}
Properties
语义块定义,属性是来用作为用户输入的一部分
属性类型
变量关系
可以在CGPROGRAM 里 声明 取得该变量
Subshader
如果Subshader不能在目标平台上使用,Unity就会 用备胎, 这个备胎就是FallBack “xxxx” 可以是 任意存在的ShaderName
Tags
用字符键值对来表示,中间用空格 隔开
状态设置 (RenderStep)
以上的RenderStep 和Tags 如果不是在Pass里写的,那么 它们将会应用到每个pass中
pass 可以 存在多个,有时候为了适应 不同的平台需要写不同的pass
pass
CGPROGRAM
在CGPROGRAM 里 经常要 定义一些 结构体,来存储 应用传递给顶点着色器的数据,a2v , 以及 顶点着色器传递给片元着色器的 数据,v2f
这些结构体的声明,必须要有个语义的声明,它表达了这个参数的含义。
和 cg/hlsl 编程 里的语义是 一样的;
a2v 语义 , 应用数据
这里的0 ,1 ,2… 可以被认为是一个存储该类型的 变量
v2f 顶点着色器传递给 片元作色器的 语义
片元作色器函数 用的语义;
SV_Target 这个语义表示 输出值将会存储到渲染目标 里;