US3S2L2——纹理相关设置
US3S2L2——纹理相关设置
重要纹理相关设置
纹理设置具体内容,详见:U3L2——图片导入概述
Texture Type(纹理图片类型)和 Texture Shape(纹理图片类型)
决定了我们是否能在Shader当中获取正确数据
Wrap Mode(循环模式):决定了缩放偏移的表现效果
Repeat:在区块中重复纹理
Clamp: 拉伸纹理的边缘
Mirror:在每个整数边界上镜像纹理以创建重复图案
Mirror Once:镜像纹理一次,然后将拉伸边缘纹理
Per-axis:单独控制如何在U轴和V轴上包裹纹理
Filter Mode(过滤模式):决定了放大缩小纹理时看到的图片质量
Point:纹理在靠近时变为块状(适合像素游戏)
Bilinear:纹理在靠近时变得模糊
Trilinear:与Bilinear类似,但纹理也在不同的Mip级别之间模糊
过滤模式在开启MipMaps根据实际表现选择,可以达到不同的表现效果
US3S2L1——纹理颜色采样
US3S2L1——纹理颜色采样
知识回顾
内置函数 —— 二维纹理采样函数,详见:US2S3L12——CG内置函数
1fixed tex2D(sampler2D tex, float2 s)
传入纹理图片和UV坐标,返回纹理图片中对应位置的颜色值
单张纹理颜色采样的Shader
关键步骤:
纹理属性和CG成员变量声明
CG中映射ShaderLab中的纹理属性,需要有两个成员变量:
一个用于映射纹理颜色数据,一个用于映射纹理缩放平移数据
ShaderLab中的属性:图片属性(2D),用于利用UV坐标提取这个图片中的颜色
1234Properties{ _MainTex("MainTex", 2D) = ""{}}
在Inspector窗口上,可以看到ShaderLab的图片属性除了关联贴图,还可以修改贴图的缩放和偏移量,
如果CG代码内需要获取贴图的缩放和偏移量这些数据,还需要额外的声明对应的 float4 变量去获取这些值
因此,CG中用于映射属性的成员变量有:
sample ...
US3S1L9——Unity内置光照计算相关函数
US3S1L9——Unity内置光照计算相关函数
Unity内置光照计算相关函数
我们在实现光照模型时,经常会进行一些数学计算,比如:坐标、法线相关的转换
在 UnityCG.cginc 中提供了一些常用的函数,可以帮助我们快捷的进行数学计算
比如我们之前将法线从模型空间转换到世界空间的方法:UnityObjectToWorldNormal 等
有了这些内置函数,我们就不需要自己去通过数学计算来得到结果了,直接调用API即可得到我们想要的结果
除了之前我们在课程中用到的一些函数外,还有一些其他的内置函数
常用内置函数
float3 WorldSpaceViewDir(float4 v)
传入模型空间下的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v)
传入世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
123float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - wPos); //计算观察方向//等价于float ...
US3S1L8——逐片元比逐顶点更光滑的原因
US3S1L8——逐片元比逐顶点更光滑的原因
知识回顾
渲染管线回顾:
通过知识点回顾,我们知道在顶点着色器和片元着色器之间还存在其他流程,比如:
裁剪
屏幕映射
三角形设置
三角形遍历
等等
也就是说顶点着色器回调函数中返回的数据,还会在这些中间流程中进行处理,再传递给片元着色器。这也是为什么逐片元比逐顶点更加平滑的原因
逐片元比逐顶点更光滑的原因
为什么逐顶点光照的渲染表现比较粗糙
顶点以外的像素点颜色,是进行插值运算的结果,效果不真实
为什么逐片元光照的渲染表现更加的平滑
每一个像素点都利用其相关数据(法线、位置等)进行颜色计算,效果更真实
注意:也侧面说明了片元着色器的性能消耗更大,顶点着色器的性能消耗更小
为何逐顶点光照比较粗糙
如果我们在顶点着色器中进行了颜色相关的计算,我们只是计算了**模型顶点位置的颜色信息**。
1234567891011v2f vert (appdata_base v){ v2f v2fData; v2fData.svPos = UnityObjectToClipPos(v.vertex) ...
US3S1L7-2——Blinn-Phong光照模型的逐片元光照
US3S1L7-2——Blinn-Phong光照模型的逐片元光照
知识回顾
Blinn Phong光照模型公式:
物体表面光照颜色=环境光颜色+兰伯特光照模型所得颜色+BlinnPhong式高光反射光照模型所得颜色物体表面光照颜色 = 环境光颜色 + 兰伯特光照模型所得颜色 + BlinnPhong式高光反射光照模型所得颜色
物体表面光照颜色=环境光颜色+兰伯特光照模型所得颜色+BlinnPhong式高光反射光照模型所得颜色
其中:
环境光颜色 = UNITY_LIGHTMODEL_AMBIENT (unity_AmbientSky、unity_AmbientEquator、unity_AmbientGround)
关于上边四个变量,详见:US3S1L5——Phong光照模型
漫反射光颜色 = 兰伯特光照模型 计算得到的颜色
高光反射光颜色 = Blinn Phong式高光反射光照模型 计算得到的颜色
利用Blinn-Phong式光照模型实现光照效果(逐片元光照)
关键步骤:
计算兰伯特光照模型
123456789101112fixed4 _MainC ...
US3S1L7-1——Blinn-Phong光照模型的逐顶点光照
US3S1L7-1——Blinn-Phong光照模型的逐顶点光照
知识回顾
Blinn Phong光照模型公式:
物体表面光照颜色=环境光颜色+兰伯特光照模型所得颜色+BlinnPhong式高光反射光照模型所得颜色物体表面光照颜色 = 环境光颜色 + 兰伯特光照模型所得颜色 + BlinnPhong式高光反射光照模型所得颜色
物体表面光照颜色=环境光颜色+兰伯特光照模型所得颜色+BlinnPhong式高光反射光照模型所得颜色
其中:
环境光颜色 = UNITY_LIGHTMODEL_AMBIENT (unity_AmbientSky、unity_AmbientEquator、unity_AmbientGround)
关于上边四个变量,详见:US3S1L5——Phong光照模型
漫反射光颜色 = 兰伯特光照模型 计算得到的颜色
高光反射光颜色 = Blinn Phong式高光反射光照模型 计算得到的颜色
利用Blinn-Phong式光照模型实现光照效果(逐顶点光照)
关键步骤:
计算兰伯特光照模型
12345678910111213fixed4 _Mai ...
US3S1L7——Blinn-Phong光照模型
US3S1L7——Blinn-Phong光照模型
Blinn Phong光照模型
来历:
Blinn Phong光照模型我们之前提到过,它是由吉姆·布林(Jim Blinn,美国计算机科学家)
在1977年时,在Phong光照模型基础上进行修改提出的
它和Phong一样是一个经验模型,并不符合真实世界中的光照现象,它们只是看起来正确
原理:
Blinn Phong和Phong光照模型一样,认为物体表面反射光线是由三部分组成的:
环境光 + 漫反射光 + 镜面反射光(高光反射光)
Blinn Phong光照模型的公式
Blinn Phong光照模型公式:
物体表面光照颜色=环境光颜色+兰伯特光照模型所得颜色+BlinnPhong式高光反射光照模型所得颜色物体表面光照颜色 = 环境光颜色 + 兰伯特光照模型所得颜色 + BlinnPhong式高光反射光照模型所得颜色
物体表面光照颜色=环境光颜色+兰伯特光照模型所得颜色+BlinnPhong式高光反射光照模型所得颜色
其中:
环境光颜色 = UNITY_LIGHTMODEL_AMBIENT (unity_Ambient ...
US3S1L6-2——Blinn-Phong式高光反射光照模型的逐片元光照
US3S1L6-2——Blinn-Phong式高光反射光照模型的逐片元光照
知识回顾
公式:
高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后顶点法线方向→⋅标准化后半角向量方向→)光泽度高光反射光照颜色 = 光源的颜色 \times 材质高光反射颜色 \times \max(0,\ \overrightarrow{标准化后顶点法线方向} \cdot \overrightarrow{标准化后半角向量方向})^{光泽度}
高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后顶点法线方向⋅标准化后半角向量方向)光泽度
标准化后顶点法线方向→⋅标准化后半角向量方向→\overrightarrow{标准化后顶点法线方向} \cdot \overrightarrow{标准化后半角向量方向}标准化后顶点法线方向⋅标准化后半角向量方向 得到的结果就是 cosθ\cos\thetacosθ
半角向量方向→=视角单位向量→+入射光单位向量→\overrightarrow{半角向量方向} = \overrightarrow{视角单位向量} + \overri ...
US3S1L6-1——Blinn-Phong式高光反射光照模型的逐顶点光照
US3S1L6-1——Blinn-Phong式高光反射光照模型的逐顶点光照
知识回顾
公式:
高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后顶点法线方向→⋅标准化后半角向量方向→)光泽度高光反射光照颜色 = 光源的颜色 \times 材质高光反射颜色 \times \max(0,\ \overrightarrow{标准化后顶点法线方向} \cdot \overrightarrow{标准化后半角向量方向})^{光泽度}
高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后顶点法线方向⋅标准化后半角向量方向)光泽度
标准化后顶点法线方向→⋅标准化后半角向量方向→\overrightarrow{标准化后顶点法线方向} \cdot \overrightarrow{标准化后半角向量方向}标准化后顶点法线方向⋅标准化后半角向量方向 得到的结果就是 cosθ\cos\thetacosθ
半角向量方向→=视角单位向量→+入射光单位向量→\overrightarrow{半角向量方向} = \overrightarrow{视角单位向量} + \overri ...
US3S1L6——Blinn-Phong式高光反射光照模型
US3S1L6——Blinn-Phong式高光反射光照模型
Blinn-Phong式高光反射光照模型
公式:
高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后顶点法线方向→⋅标准化后半角向量方向→)光泽度高光反射光照颜色 = 光源的颜色 \times 材质高光反射颜色 \times \max(0,\ \overrightarrow{标准化后顶点法线方向} \cdot \overrightarrow{标准化后半角向量方向})^{光泽度}
高光反射光照颜色=光源的颜色×材质高光反射颜色×max(0, 标准化后顶点法线方向⋅标准化后半角向量方向)光泽度
标准化后顶点法线方向→⋅标准化后半角向量方向→\overrightarrow{标准化后顶点法线方向} \cdot \overrightarrow{标准化后半角向量方向}标准化后顶点法线方向⋅标准化后半角向量方向 得到的结果就是 cosθ\cos\thetacosθ
半角向量方向→=视角单位向量→+入射光单位向量→\overrightarrow{半角向量方向} = \overrightarrow{视角单位向量} + ...