shader基本概念讲解

本文将深入浅出地介绍Shader的基本概念,特别是在Unity3D游戏引擎中的应用。Shader是图形渲染的重要组成部分,用于控制物体表面的外观。通过学习Shader,开发者可以实现更高级的渲染效果,如实时反射、折射、光照等。在游戏开发中,理解并掌握Shader能提升游戏视觉体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备注:本文章为学习笔记,讲解内容为蛮牛-守望整理、所有。

Part A
1.渲染管线流程细分:
    顶点处理
    面处理
    光栅化
    像素处理

顶点处理:
    1.顶点变化:将每个物体位置转换为世界坐标。
    2.观察坐标系-投影坐标系:将每个物体从世界坐标投影到观察者的投影平面上。
面处理:
    1.面的组装
    2.面的剔除:物体间遮挡,看不到的部分就不用计算了。
    3.面的截取:摄像机(眼睛)看到的范围为一个椎体,看不到的周边做一个截取。
光栅化:将以向量为基本的面转换成一个个点阵形式的像素集合。屏幕输出的时候是以像 素输出。


像素处理:将以向量为基本的面转换为一个个点阵形式的像素集合。
    对每个像素区域进行着色
    对像素贴上贴图
    最终形成2d画面


shader三种数据类型,fixed在某些显卡中可能不被很好的支持。



materials材质面板对应结果



Part B
1.简介
Unity中所有的渲染都使用着色器完成
    1.顶点和片段着色器:功能最强大、最自由的形态,特征是在Pass里面出现CGPROGRAM和ENDCG块。
    2.表面着色器:推荐的照射器,相对简单强大,有光照和阴影的影响。如果未对光线进行任何处理,请勿使用表面着色器。
    3.固定功能着色器:适用于陈旧、古老的硬件。

固定功能 着色器



顶点和片段着色器


表面着色器


可以在Shader中写多个SubShader,但是其后每个SubShader中必须写Pass{},写多个SubShader可以解决兼容性问题,第一个SubShader不行就执行后面一个SubShader。如果所有的SubShader都不满足要求 时则使用Fallback "Diffuse"会退到另一个Shader。

Pass为渲染通道,一个SubShader中可以有多个Pass,意义为多次渲染,Pass应该尽量的少。
表面着色器中没有Pass,其会被编译一次,在编译的过程中会加上Pass,如果手动加会报错。

LOD,其值的设定有主的适配各种机型,进行各种处理。



2.剔除和深度测试(Cull,ZWrite,ZTest)

深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;
深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;
深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;
深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区。





1.cull off为正反面都绘制




2.cull back不渲染背面
(cull back的材质赋给平面)


平面的背面没有被绘制


3.cull front不渲染正面(材质赋值给平面)



zwrite
默认状态下,深度缓存开启,前面的物体会遮住后面的物体。




zwrite off后,两者都可以被看到


ztest(例子中shader赋给材质,材质赋给当前选中的物体)
ztest less



ztest greater




3.tag标签,用键值对的方法书写,之间用空格隔开
tag分为四类,Queue渲染序列,Render Type渲染类型,ForceNoShadowCasting表示接不接受阴影(为true时),IgnoreProjector表示不接受Projector组件的投影(为true时)。
Render Type
    Opaque 不透明,最常用的一种
    Transparent 绝大部分透明的物体,包括粒子特效都使用这个
    Background 天空盒使用的这个
    Overlay GUI 镜头光晕使用这个
Queue(注意,取消深度缓冲后后渲染的物体会把先渲染的东西遮住)
    值越小越先绘制。
    Background值为1000,比如天空盒
    Geometry最为常用,用作不透明物体,值为2000
    AlphaTest值为2450
    Transparent值为3000
    Overlay值为4000
    用户自定义任意值,比如"Queue"="Geometry+10"


4.透明测试(AlphaTest),常用于花草树木的绘制。
需要一张带Alpha通道的图片
写一个shader命名为AlphaTest




Direct3D 11可能不支持AlphaTest不能正确显示透明效果,BuildingSetting中的Player Setting中Direct3D 11不要勾选。


我们写的是alpha Greater,是指的仅仅渲染大于AlphaValue的像素。随着alpha值的变化,观察图片中的变化。







5.混合(Blending)



one zero



oneone



zero one



bending常用的组合
    1.Alpha混合(类似于玻璃的效果,炫):

    2.相加:One One

    3.柔和相加:OneMinusDSTColor One


    4.相乘:DSTColor Zero

    5.2倍相乘:DSTColor SrcColor


6.雾(fog)
全局雾的设置:Edit->Render Setting->Fog

每个面每个模型可以设置自己的雾
fog可以写在subshader中,也可以写在pass通道中







远距离观察效果


距离观察效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值