前言
之前学过一段时间的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 这个语义表示 输出值将会存储到渲染目标 里;
本文深入探讨Unity ShaderLab的基础知识,解析渲染流水线的四大阶段:应用、几何、光栅和测试阶段。详细阐述ShaderLab中各阶段对应的关系,如应用阶段的a2v、几何阶段的vertex以及光栅化阶段的fragment等。同时,介绍了Unity内置的Structappdata_full,以及GPU与CPU间的通信原理,为读者提供了一个全面理解Unity ShaderLab的视角。

1967

被折叠的 条评论
为什么被折叠?



