学了unity shader 明白一件事情,之前学习的 opengl 渲染管线,以及写过的 z-buffer 纯纯让自己陷入了渲染引擎的局部。 还不如看看 shader 语法,这样能够了解渲染的关键部分,以及通用对象,很多之前看不懂了,不知道为啥那么做的,现在一下子就懂了。 就是不学之前以为学的要很多,学了之后知道才知道框架基本是固定的,真正要学的是里面的创意,以及如何写才能高效。
最好读一下 《Real time rendering》和 《learning opengl 》 学一些基础知识
FB0
帧缓存对象, 其实最长用的用途就是 后处理, 先渲染到这里,然后做后处理,最后作为整个贴图渲染到屏幕
在正向渲染中照亮一个片段所需要的所有数据:
一个3D位置向量来计算(插值)片段位置变量供lightDir和viewDir使用
一个RGB漫反射颜色向量,也就是反照率(Albedo)
一个3D法向量来判断平面的斜率
一个镜面强度(Specular Intensity)浮点值
所有光源的位置和颜色向量
玩家或者观察者的位置向量
但是想象一下如果有多个光源怎么办,那不得调用多次吗? 这就要用延迟渲染了
延迟着色法基于我们延迟(Defer)或推迟(Postpone)大部分计算量非常大的渲染(像是光照)到后期进行处理的想法。它包含两个处理阶段(Pass):在第一个几何处理阶段(Geometry Pass)中,我们先渲染场景一次,之后获取对象的各种几何信息,并储存在一系列叫做G缓冲(G-buffer)的纹理中;如位置向量(Position Vector)、颜色向量(Color Vector)、法向量(Normal Vector)和/或镜面值(Specular Value)。场景中这些储存在G缓冲中的几何信息将会在之后用来做(更复杂的)光照计算。
[https://baijiahao.baidu.com/s?id=1713339702599327160](Metallic vs Specular 两套工作流程)
里面有 mask map
R: metallic
G: Ambient occulation
B: Detail Mask
A: smoothness
似乎需要一个 diffusion profile , 来表达扩散程度
uniform
统一数据类型
shader调用时,首先创建一个名字,然后
可以参考下这个博客 https://www.jianshu.com/p/4eb04f76f9a8
nm='fs_sky_color_banding_fix'
#nm=vs_sky
$shaderc -f ./$nm.sc -o ./hlsl/$nm.hlsl --depends -i ../../src --varyingdef varying.def.sc --platform windows -p vs_5_0 --type ${nm:0:1} --preprocess
批处理
shaderc=bin/shaderc.exe
ddir=.
for file in $ddir/*.sc
do
nm=`basename $file .sc`
echo $nm
if [[ ! "$nm" =~ ^[vf]s ]]; then
continue
fi
$shaderc -f $ddir/$nm.sc -o hlsl/$nm.hlsl --depends -i $ddir --varyingdef $ddir/varying.def.sc --platform windows -p vs_5_0 --type ${nm:0:1} --preprocess
vim hlsl/$nm.hlsl -s clearcode.vim
done
https://www.bilibili.com/video/BV1sh41147zb
debug 方法: window-> analysis->frame debugger 用于查看渲染过程进行debug
基本的变量和基本 shader 的编写
a2v: application to vertice
标准光照模型
拆成四部分,分别用模型计算然后组合, ambient, emissive, diffuse, specular
_ST 纹理的缩放和平移属性
float4 TANGENT: 顶点的切线方向 , 4 是因为决定副切线的方向。
代码要考虑复用结构,这样可以减少计算之类的。
凹凸贴图那里,要知道得再物体坐标系下定义法向量,也叫切空间下的normal
https://juejin.cn/post/7056031676727558157
分割模型其实也是为了渲染顺序中好排序,或者凸面体。
alpha 测试
透明度混合需要关闭深度写入,
透明度混合, 两个 pass ,第一个先获得深度信息。
光照部分:
处理光照可以按照逐像素,逐顶点以及SH 处理。 渲染的时候按照重要程度排序,然后选择。
比如 unity 会这样设置 【我猜测这就是实时渲染引擎的重要之处】
延迟渲染:古老的,多一个缓冲,但是不支持真正的抗锯齿
game object 中有个 render cube