unity-shader-03
2024年2月21日
摘要:回顾渲染流程,尝试vs写shader,以及一些开放参数的了解。
回顾渲染流程
以美术绘画的角度理解渲染管线,比较形象。
渲染阶段 | 比喻角度 | |
---|---|---|
模型 | > | 石膏几何体 (看到现实中3d的物体) |
输入结构 | > | 几何体的基本几何构成 (脑海里得到的信息) |
顶点shader | > | 通过透视理论加脑海里得到的信息 (在纸上画出基本大型) |
输出结构 | > | 通过顶点信息得到面向信息-也就是面的朝向 (在脑海里得知几何体的面朝向) |
像素shader | > | 通过环境的灯光反射信息等-给每个面赋予素描关系(给在纸面上的大型添加素描关系) |
渲染结果 | > | 后处理就是 对前面的效果进行一点调整 (例如画完后习惯性用纸笔或者手胡一下) |
尝试shader代码
首先是关联Unity里关联到VScode, 以shader forge新建基础的shader来识别代码,去看unity的基本代码结构。
1.untiy关联VScode
这样双击任何一个shader就可以跳转到vscode里进行查看与编辑代码
2.了解简单的shader代码结构
建一个最简的shader模板
- 改名设置shader路径
- 无开放参数
- Light Count(光照计算)- Single Directional (单个方向光-太阳光)
- 几何体-Normal Quality - interpolated(归一化)
了解语句结构
逐句分析
// 定义顶点输入结构体,包含一个四维向量作为顶点位置信息
struct VertexInput {
float4 vertex : POSITION;
};
// 定义顶点输出结构体,包含一个四维向量用于屏幕空间位置(SV_POSITION表示这是最终位置)
struct VertexOutput {
float4 pos : SV_POSITION;
};
// 顶点着色器函数:将对象空间中的顶点坐标转换到屏幕空间,并返回VertexOutput类型数据
VertexOutput vert(VertexInput v) {
// 创建一个VertexOutput类型变量o,并初始化为空值
VertexOutput o = (VertexOutput)0;
// 将输入的vertex通过UnityObjectToClipPos函数转换到屏幕空间,并赋值给o.pos
o.pos = UnityObjectToClipPos(v.vertex);
return o; // 返回处理后的结果数据
}
// 片元着色器函数:确定每个像素显示什么颜色
float4 frag(VertexOutpu i) : COLOR {
float3 emissive = float3(1, 0.46, 0); // 设置发光属性RGB值
float3 finalColor = emissive; // finalColor等于发光属性
return float4(finalColor,1.0); // 返回计算得到的finalColor(emissive),及alpha=1
}
根据下图创建一个shader的文件-并且复制一个基本shader结构,简单修改返回值,
更改 return float4
的颜色信息。
3.通过代码-实现 lambert 效果
与shaderforge代码对比-自己手敲的会减少一些无用的代码。
这里讲到unity存光照位置的时候是个齐次坐标,0代表向量,1代表点
_WorldSpaceLightPos0.w为0,表示该光源为平行光。
_WorldSpaceLightPos0.w为1。则表示光源为点光源或聚光灯
节点组-开放参数
常用的开放参数:
- texture - 贴图
- vecotr - 向量
- silider - 滑块
- switch - 开关
- color - 颜色
课后作业
作业:
ps:作业要求是只在暗部进行明暗的变化,尝试通过if去获取mask指控制暗部的范围然后再
通过add叠加,或者blend叠加,看起来都不太理想,
会全局进行明度变化,并不只是在暗部进行明暗的变化。