GAMES202-作业1-part2
GAMES202 作业1-part2应老师要求不会直接放上作业答案,会记录整体思路和核心代码
PCF主要步骤
获取shadow map和对应的坐标
设置filter和随机采样的数目
使用泊松分布采样
判断每个采样点的shadow map值
进行累加求平均
12345// 修改了老师给的函数的签名,新增了一个参数,其实按照pdf的说明,加了这个参数才比较合理float PCF(sampler2D shadowMap, vec4 coords, float filter_size)// filter_size是根据图片大小来的,这里是1.0/2048.0,可以根据实际需求乘以2.0-10.0// 随机采样的样本数目是通过glsl文件开头的NUM_SAMPLES进行修改的
接着使用泊松分布
12// 泊松分布采样,采样输出的范围会很大很可能覆盖整张图poissonDiskSamples(coords.xy);
然后通过每个对采样点进行判断累加结果
123456789for(int i = 0;i < PCF_NUM_SAMPLES; i++){ // 因为sha ...
GAMES202-作业1-part1
GAMES202 作业1-part1应老师要求不会直接放上作业答案,会记录整体思路
Two Pass Shadowmap主要实现硬阴影,在shadowmap作业中需要修改的地方有两个
DirectionalLight.js中CalcLightMVP()函数MVP函数的参数签名如下
CalcLightMVP(translate, scale){}
首先需要做的是根据translate和scale进行model transform
1234567// 主要使用的两个函数// scale中a表示变换完之后存储的地方,b表示原矩阵,c表示变换mat4.scale(a, b, c);// 示例mat4.scale(modelMatrix, modelMatrix, scale);// translate同理mat4.translate(a, b, c);
接着是view transform,这里是根据提供的lightPos,focalPoint和lightUp进行lookat矩阵的构造
123456// lookAt函数// a - 存储结果// b - light position// c ...
光照模型和法线贴图(悲惨调试经历)
实习的悲惨事故,主要在两个细小得错误上花费了特别多的时间,两个都是出在宏定义的地方,先把这个东西高高挂起
#pragma multi_compile_fwdadd
写成了multi_comple_fwdadd,导致在写多光源部分找了很久没找到问题,一直以为是代码逻辑出错
光照光照计算的思考方式
光源
模型表面材质结构
观察方向
光源
光源类型
聚光灯和点光有衰减
光源方向
光源颜色
灯光数据传递方式—RenderPath
Forward 前向渲染
Unity内置渲染管线Built-in
Unity URP渲染管线
光照方面,能够在单个pass处理多个灯光
Deferred 延迟渲染:以灯光为单位进行渲染,因为使用了MRT
UE4默认路径
Unity UDRP渲染管线
RenderPath决定了shader是以怎样的一个规则去计算灯光的
前向渲染:unity内置的渲染管线, unity URP渲染管线
延迟渲染:UE4默认渲染路径, Unity HDRP渲染管线
前向渲染:物体被重复叠加绘制多次(实时灯光的数量)forwardadd函数
前向渲染的消耗问 ...
GAMES202-Lecture3笔记
GAMES202-Lecture3实时阴影
Shadow Mapping特点:
2个Pass的算法
light pass生成shadow map
camera pass使用shadow map
是图像空间的算法,当shadow map已经生成,那么就不需要实际的场景中的物体,直接使用shadow map就可以计算阴影
坏处:
自遮挡现象
走样的问题
过程:
pass1: 从光源方向渲染,只需要一个深度的信息
pass2: 从相机方向开始渲染
和光源方向的开始比较,如果点和相机方向的相同,那么就是能被光找到,如果不行那么就是在阴影中,用z值还是实际距离都行,但是要保持一致。
自遮挡问题shadow map记录的是不连续的,因此会出现阴影和物体断开的现象,可以通过添加一个bias来减少自遮挡问题 — 当光源和平面夹角越大,那么bias越大(会导致阴影的断开),bias的大小也会影响阴影的质量
second-depth shadow mapping:
不仅存最小深度,还存次小的深度,之后用这两个深度取一个中间值
但是工业界不用
走样问题渲染的时候分辨率不够大
shadow ...
模糊算法
模糊算法大部分模糊算法参考在这里
均值模糊原理:通过卷积核对周围的像素进行平均,所有权重都是一样的
shader123// 这个是内置变量,x = 1/width, y = 1/height, z = width, w = height// 这样x,y就能代表偏移值float4 _MainTex_TexelSize;
2 * 2均值模糊,其他模糊以此类推
shader12345678// 2*2 均值模糊half4 d = _MainTex_TexelSize.xyxy * half4(-1,-1,1,1) * _BlurOffset;half4 s= 0;s += tex2D(_MainTex, i.uv + d.zw);s += tex2D(_MainTex, i.uv + d.zx);s += tex2D(_MainTex, i.uv + d.xz);s += tex2D(_MainTex, i.uv + d.xy);s *= 0.25;
可通过在C#脚本中可以提高迭代次数
12345678Graphics.Blit(source, rt1, material);for(in ...
后处理逻辑
后处理逻辑原理:根据屏幕的大小设置一个正方形的面片,重新渲染这个面片,调用shader,之后对帧缓冲区图像进行自定义的处理。
OnRenderImage()的on一定要大写!一定要大写!查错查了可久
12345678910111213141516171819// ExecuteInEditMode函数让脚本在编辑阶段可运行[ExecuteInEditMode()]public class ImageEffectTest: MonoBehaviour{ public Material material; void Start(){ // 是否使用当前后处理的判断逻辑 if(material == null || SystemInfo.supportsImageEffects == false || material.shader == null || material.shader.isSupported == false){ enabled = false; retu ...
基础shader记录
基础shader分析常见的语义词:
获取顶点 — float4 vertex : POSITION;
获取第一uv — float2 uv : TEXCOORD0;
获取发现 — float3 normal : NORMAL;
获取顶点色 — float4 color : COLOR;
获取切线 — float4 tan : TANGENT;
常用的数据类型对应精度设置float – 32位,half – 16位, fixed – 8位
float常用于坐标点
half常用于UV和大部分向量
fixed常用于颜色
基础shader内容:获取位置坐标并输出1234567891011121314151617181920211. 基础变换 -- 顶点着色器中将物体转换到裁剪空间v2f vert(appdata v){ v2f o; // 模型转换到世界空间 float4 pos_world = mul(_Object2World, v.vertex); // 世界空间到相机空间 float4 pos_view = mul(UNITY_MATRIX_V, pos_world) ...
GAMES202作业0
GAMES202作业0本次作业主要为熟悉框架,通过框架实现blinn-phong,无特殊要求
大致步骤:
使用GLSL编写对应vert和frag shader
将shader的字符串形式传递到javascript实现的PhongMaterial类中
在index.html中导入
将框架中原来使用的Material替换为编写好的PhongMaterial类
最初效果
最终效果