图形学基础 | UnityShader入门精要学习笔记(5-6章)

Unity Shader学习 第五章 基本的Shader学习

Unity的场景是一个天空盒(skybox). 不是纯色的

#pragma vertex vert
#pragma fragment frag

告诉编译器 哪个函数是顶点着色器. 哪个函数是片元着色器

SV_POSITION 告诉顶点着色器. Unity输出 是裁剪空间中的顶点坐标.

SV_Target 屏幕输出

UNITY_MATRIX_MVP 内置的 模型-观察- 投影 矩阵
被替换成了: UnityObjectToClipPos

着色器数据从哪里来

  • 使用结构体传参
  • 如 a2v a表示Application 应用 v表示vertex 顶点着色器

顶点着色器和片元着色器的通信

定义如 v2f 这样的结构体. 
在顶点着色器最后返回 return v2f类型的
函数的定义如下:

v2f vert(a2v i){
    v2f o;
    //...
    return o;
}

fixed4 frag(v2f i){
    return fixed4();
}

Unity的内置变量

https://blog.csdn.net/laverfever/article/details/23171155

头文件包含Unity内置
#include "UnityCG.cginc"

如何进行Shader调试?

方法1: 假彩色图. 假颜色生成一种图像.
用图像来可视化一些数据.
注意: 颜色的范围在 [0,1]

方法2: Graphics Debugger

纹理坐标差异

OpenGL 左下是 (0,0)

DirectX 左上是(0,0)

Shader代码整洁之道

float / half / fixed

数值类型有这三种.

  • float 32位
  • half 16位
  • fixed 11位 精度范围 -2.0到2.0
避免没有必要的计算

不同的 shader Target / 不同的着色器阶段. 可使用的临时寄存器和指令数目都不同.
如:
#pragma target 2.0 
#pragma target 3.0 

所有的OpenGL被当成支持到Shader Model3.0

慎用分支和循环语句

GPU和CPU对于分支的处理不同. 最好别使用分支与循环
建议:

  • 分析判断语句使用的变量最好为常数!
  • 每个分支指令操作指令尽可能少
  • 分支嵌套要尽可能少
不要除以0!!!

Unity Shader学习 第六章 基本光照

光源

  • 实时渲染中,将光源看做没有体积的点

  • 如何量化光!!! 辐照度irradiance

  • 吸收与散射

    • 散射到内部: 折射和透射
    • 散射到外部: 反射 分为 高光反射 和 漫发射

着色

  • 着色就是根据材质的属性 光源信息 使用某个等式去计算沿着观察方向的出射度的过程.
  • 这个等式叫做 “光照模型”

BRDF 光照模型!!!

  • 计算光照颜色. 需要知道光线和一个表面是如何交互的.

  • 当光线从某个方向照射到一个表面时. 有多少光被反射,反射的方向有哪些?

  • BRDF(Bidirectional Reflectance Distribution Function) 双向反射分布方程

标准光照模型

Phong模型 只关心 直接光照 direct light

  • 自发光 emissive  没有全局光照时.自发光不会影响周围的物体
  • 高光反射 specular  光线发生完全镜面反射散射多少辐射量
  • 漫反射 diffuse  向每个方向散射多少能量
  • 环境光 ambient  描述其他所有间接光照

Blinn-Phong模型

  • 简化了Phong模型的部分计算.

逐像素还是逐顶点

per-pixel-lighting

  • 逐像素就是说在片元着色器中计算光照
  • Phong着色

per-vertex-lighting

  • 逐顶点就是在顶点着色器中计算光照. 会插值出所有像素的光照
  • Gouraud Shading

Unity中的环境光和自发光

UNITY_LIGHTMODEL_AMBIENT 环境光

saturate函数  将颜色值规范到0~1之间

实践:
  • 实现 逐顶点漫反射 / 高光反射
  • 实现 逐像素漫反射 / 高光反射

Unity的内置函数

https://blog.csdn.net/a6627651/article/details/50680360

https://blog.csdn.net/laverfever/article/details/23962411

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值