OpenGL图形学
似乎我当初学的opengl主要是 固定管线编程,相比dx写法要简单一点,但今后肯定都是做 着色器模式编程
光照模型
BRDF光照模型
兰伯特
Phong
Blinn-Phong
菲涅尔反射
一些技术名词
纹理映射:UV贴图展开,将2D纹理坐标映射到3D物体上。美术就是在此基础上绘制贴图的
纹理滤波:通过技术平滑纹理texel和三维图形pixel之间的对应
法线贴图:逐像素计算光照时,每一个像素都会根据该点的法向量来计算最终该点的光照结果(光照模型需要法线参与),通过调节亮度,让人感觉这个模型深度不一致,产生凹凸感。
> 通常我们把高模的法线信息保存在一张图里,再给低模使用,低模就可以有跟高模一样的法线
AO贴图(Ambient/Reflective Occlusion):环境光散射。通常是灰白色
立方体纹理:环境映射
渲染纹理:玻璃效果(摄像机渲染结果)。多重渲染目标(延迟渲染)
程序纹理:计算机生成的纹理,如函数纹理
阴影
原理:ShadowMap技术,把Camera放在光源上,看不见的地方就是阴影(光线无法到达)
- 平行光计算出阴影映射纹理 shadowmap,是一张灰度图
- 若 Pass或Fallback 中有 LightMode = ShadowCaster 的话,该物体就可以投射阴影,在该Pass中计算
阴影映射
- 传统的实现中,先在正常渲染Pass中得到顶点的位置信息,再对shadowmap采样得到阴影信息。如果顶点深度>阴影的深度,就说明该点位于阴影中(阴影映射在物体表面了)
- Unity则用了屏幕空间的阴影映射技术,即根据阴影映射纹理和相机深度纹理得到屏幕空间的阴影图。如果相机深度>阴影深度,则说明该表面上有阴影
环境映射
效果:在物体表面映射周围环境,让物体具有逼真的反射效果,常用于光滑物体,如镜子
实现:Cubemap(也是天空盒的实现方式)
具体:创建一个Cubemap(6个面),注意6张纹理WrapMode都要Clamp
PBS中常常会使用HDR图像生成高质量Cubemap
脚本创建法:go.GetComponent().RenderToCubemap(cubemap);
用RenderCubemapWizard这个脚本
Reflection 环境反射
Refraction 折射
Fresnel 菲涅尔反射
渲染纹理
Mirror 镜子
原理:使用一个渲染纹理(在Unity中自己创建一个Render Texture)作为输入属性,并把该渲染纹理在水平方向上翻转后直接显示到物体上
Grass Refraction 玻璃效果
和使用渲染纹理不同,GrabPass是抓取屏幕
屏幕后处理
PostEffectsBase 屏幕特效基类,确认能否使用ImageEffects
BrightnessSaturationAndContrast 调整屏幕亮度,饱和度,对比度
屏幕后处理的原理:script+material+shader
亮度用乘积即可实现,饱和度和对比度要用插值实现
EdgeDetection 边缘检测
原理是用 卷积 计算像素梯度,叠加值后根据其大小,用lerp将其颜色逼近Edge Color,不同程度的边界点颜色就会不一样
GaussianBlur 高斯模糊
略难...
Bloom 散光
原理是先根据一个阈值提取出图像中较亮的区域,再高斯模糊模拟光线扩散
Motion Blur 运动模糊
Fog 雾效