• 渲染基础概念 unity shader 材质相关学习


    学了unity shader 明白一件事情,之前学习的 opengl 渲染管线,以及写过的 z-buffer 纯纯让自己陷入了渲染引擎的局部。 还不如看看 shader 语法,这样能够了解渲染的关键部分,以及通用对象,很多之前看不懂了,不知道为啥那么做的,现在一下子就懂了。 就是不学之前以为学的要很多,学了之后知道才知道框架基本是固定的,真正要学的是里面的创意,以及如何写才能高效。

    渲染基础知识

    最好读一下 《Real time rendering》和 《learning opengl 》 学一些基础知识
    FB0 帧缓存对象, 其实最长用的用途就是 后处理, 先渲染到这里,然后做后处理,最后作为整个贴图渲染到屏幕

    延迟渲染

    在正向渲染中照亮一个片段所需要的所有数据:
    
    一个3D位置向量来计算(插值)片段位置变量供lightDir和viewDir使用
    一个RGB漫反射颜色向量,也就是反照率(Albedo)
    一个3D法向量来判断平面的斜率
    一个镜面强度(Specular Intensity)浮点值
    所有光源的位置和颜色向量
    玩家或者观察者的位置向量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    但是想象一下如果有多个光源怎么办,那不得调用多次吗? 这就要用延迟渲染了

    延迟着色法基于我们延迟(Defer)或推迟(Postpone)大部分计算量非常大的渲染(像是光照)到后期进行处理的想法。它包含两个处理阶段(Pass):在第一个几何处理阶段(Geometry Pass)中,我们先渲染场景一次,之后获取对象的各种几何信息,并储存在一系列叫做G缓冲(G-buffer)的纹理中;如位置向量(Position Vector)、颜色向量(Color Vector)、法向量(Normal Vector)和/或镜面值(Specular Value)。场景中这些储存在G缓冲中的几何信息将会在之后用来做(更复杂的)光照计算。

    HRDP 着色器基础介绍

    [https://baijiahao.baidu.com/s?id=1713339702599327160](Metallic vs Specular 两套工作流程)

    SSS Subsurface scattering

    里面有 mask map

    R: metallic
    G: Ambient occulation 
    B: Detail Mask
    A: smoothness
    
    • 1
    • 2
    • 3
    • 4

    SSSS Screen-Space-Subsurface-Scattering

    似乎需要一个 diffusion profile , 来表达扩散程度

    bgfx

    基础知识

    uniform 统一数据类型
    shader调用时,首先创建一个名字,然后

    sc 转 unity 的使用

    可以参考下这个博客 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
    
    • 1
    • 2
    • 3

    批处理

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Unity Shader 入门精要

    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

  • 相关阅读:
    盲目跟风考PMP认证?PMP还剩多少含金量?
    接口测试入门实践
    并查集(Union-Find)
    gpu cuda 矩阵乘法
    TheadLocal:当前线程的全局变量
    Win11杜比全景声无法正常运行的解决方法教学
    基于Kafka和Elasticsearch构建实时站内搜索功能的实践
    Air实现Go程序的热重载(热加载)
    面试不到10分钟就被赶出来了,问的实在是太变态了...
    【附源码】Python计算机毕业设计社区团购配送与管理系统
  • 原文地址:https://blog.csdn.net/ChangHongJian/article/details/126200404