1 前言

固定管线着色器一 中介绍了 Shader 中外部属性、光照、贴图等基础用法,本文将进一步讲解固定管线着色器,介绍正面与反面剔除、Alpha 测试、深度测试、混合、渲染队列等用法。渲染管线相关理论知识详见→渲染管线

2 正面与反面剔除

​ 正面是指模型的表面,反面是指模型的内壁,一般而言,Unity3D 只绘制模型表面,不绘制模型内壁。通过正面(Cull Front)与反面剔除(Cull Back),能够实现正面和反面独立绘制。

​ FixedShader.shader

Shader "MyShader/ShaderTest"
{
Properties
{
// 属性名 ("面板显示名称", 类型) = 默认值
_FrontColor ("正面颜色", Color) = (1, 0, 0, 1)
_BackColor ("反面颜色", Color) = (0, 1, 0, 1)
} SubShader
{
Pass
{
Lighting On // 开启顶点光照
Cull Back // 剔除背面, 渲染正面
Material
{
Diffuse[_FrontColor] // 漫反射光颜色
}
} Pass
{
Lighting On // 开启顶点光照
Cull Front // 剔除正面, 渲染背面
Material
{
Diffuse[_BackColor] // 漫反射光颜色
}
}
} Fallback "Diffuse"
}

​ 在 Assets 窗口创建 Material,选中创建的 Material,在 Inspector 窗口创建的 Shader,如下:

​ 新建 2 个 Plane 对象,将 MaterialTest 拖拽到其中一个 Plane 对象上,另一个作为对比,效果如下:

3 Alpha 测试

​ 检查像素的 Alpha 值,只有 Alpha 值满足条件的像素才会进行绘制 。渲染管线 第 7 节详细介绍了 Alpha 测试。

​ FixedShader.shader

Shader "MyShader/ShaderTest"
{
Properties
{
// 属性名 ("面板显示名称", 类型) = 默认值
_AlphaThreshold ("Alpha阈值", Range(0, 1)) = 0.5
_Texture2D ("2阶贴图", 2D) = "white" {}
} SubShader
{
Pass
{
// Always Never Greater Less Equal GEqual LEqual NotEqual
AlphaTest Greater [_AlphaThreshold] // 像素alpha值大于_AlphaThreshold才绘制, 否则不绘制
SetTexture[_Texture2D]
{
Combine Texture
}
}
} Fallback "Diffuse"
}

​ 选中绑定的 Material,在 Inspector 窗口调整 Alpha 阈值,显示效果如下:

4 深度测试

​ 在深度缓冲区中为每个像素保存了一个 “深度值”(顶点到相机的距离),当像素需要进行深度测试时,将缓冲区中深度值与该像素的深度值进行比较,符合条件的通过测试,并覆盖缓冲区中深度值,不符合条件的则被丢弃,不进行绘制 。渲染管线 第 7 节详细介绍了深度测试。

​ FixedShader.shader

Shader "MyShader/ShaderTest"
{
Properties
{
// 属性名 ("面板显示名称", 类型) = 默认值
_ShowColor ("显示颜色", Color) = (1, 0, 0, 1)
_ShelterColor ("遮挡颜色", Color) = (0, 1, 0, 1)
} SubShader
{
Pass
{
// Always Never Greater Less Equal GEqual LEqual NotEqual
ZTest Greater // 大于或等于当前深度才通过深度测试, 绘制像素, 否则不绘制
ZWrite Off // 关闭深度缓存
Lighting On // 开启顶点光照
Material
{
Diffuse[_ShelterColor] // 被遮挡时渲染绿色
}
} Pass
{
ZTest LEqual // 小于当前深度才通过深度测试, 绘制像素, 否则不绘制
Lighting On // 开启顶点光照
Material
{
Diffuse[_ShowColor] // 没被遮挡时渲染红色
}
}
} Fallback "Diffuse"
}

​ 选中绑定的 Material,在 Inspector 窗口调整显示颜色和遮挡颜色,并将该 Material 拖拽到一个 Cube 对象上,再新建一个 Sphere 对象,用于遮挡 Cube,显示效果如下:

5 混合

​ 在物体遮挡场景下,未开启混合时,前面的物体会遮住后面物体;开启混合后,根据物体的色光三元色和透明度进行混合。 读者可以在Visual glBlendFunc + glBlendEquation Tool 网站查看不同混合设置的混合效果。渲染管线 第 8 节详细介绍了混合。

Blend On | Off // 开启/关闭混合
Blend SrcFactor DstFactor // 配置源像素混合因子和目标像素混合因子
Blend SrcFactor DstFactor,SrcFactorA DstFactorA // 配置源像素混合因子和目标像素混合因子, RGB和Alpha通道分开配置
BlendOp Add | Min | Max | Sub | RevSub // 配置混合关系: 相加混合、取最小值混合、取最大值混合、相减混合(src-dst)、反减混合(dst-src)

​ 混合因子如下:

// 源颜色为: (sR, sG, sB, sA), 目标颜色为: (dR, dG, dB, dA)
Zero // (0, 0, 0, 0)
One // (1, 1, 1, 1)
SrcColor // (sR, sG, sB, sA)
DstColor // (dR, dG, dB, dA)
OneMinusSrcColor // (1, 1, 1, 1) - (sR, sG, sB, sA)
OneMinusDstColor // (1, 1, 1, 1) - (dR, dG, dB, dA)
SrcAlpha // (1, 1, 1, 1) * sA
DstAlpha // (1, 1, 1, 1) * dA
OneMinusSrcAlpha // (1, 1, 1, 1) * (1-sA)
OneMinusDstAlpha // (1, 1, 1, 1) * (1-dA)
SrcAlphaStaturate // (1, 1, 1, 1) * min(sA, 1-dA)

​ FixedShader.shader

Shader "MyShader/ShaderTest"
{
Properties
{
// 属性名 ("面板显示名称", 类型) = 默认值
_DiffuseColor ("漫反射颜色", Color) = (0, 1, 0, 0.5)
} SubShader
{
Pass
{
Blend SrcAlpha OneMinusSrcAlpha // 透明混合
Lighting On // 开启顶点光照
Material
{
Diffuse[_DiffuseColor] // 漫反射颜色
}
}
} Fallback "Diffuse"
}

​ 选中绑定的 Material,在 Inspector 窗口调整显示颜色,并将该 Material 拖拽到一个 Sphere 对象上,再新建一个 Cube 对象,作为混合背景,显示效果如下:

6 渲染队列

​ 在关闭深度测试后,所有像素点都会通过深度测试,都会进行绘制,这时就不存在深度概念,不管后绘制的物体在先绘制的物体的前面还是后面,后绘制的物体都会遮挡先绘制的物体。在 Shader 中,用户可以通过如下方式指定物体的渲染顺序:

Tags
{
// Background(1000, 后台)、Geometry(2000, 几何体, 默认)、Transparent(3000, 透明)、Overlay(4000, 覆盖)
"Queue"="Background" // 渲染顺序为1000, 值越小越先绘制
// "Queue"="Transparent+5" // 渲染顺序为3005, 值越小越先绘制(加号两边不要加空格)
}

​ FixedShader_Cube.shader

Shader "MyShader/ShaderTest_Cube"
{
Properties
{
// 属性名 ("面板显示名称", 类型) = 默认值
_DiffuseColor ("漫反射颜色", Color) = (1, 0, 0, 1)
} SubShader
{
Tags
{
// Background(1000, 后台)、Geometry(2000, 几何体, 默认)、Transparent(3000, 透明)、Overlay(4000, 覆盖)
"Queue"="Transparent" // 渲染队列
}
Pass
{
ZTest Off // 关闭深度测试
Lighting On // 开启顶点光照
Material
{
Diffuse[_DiffuseColor] // 漫反射颜色
}
}
} Fallback "Diffuse"
}

​ 将 FixedShader_Cube.shader 绑定的 Material 拖拽到 Cube 游戏对象上。

​ FixedShader_Sphere.shader

Shader "MyShader/ShaderTest_Sphere"
{
Properties
{
// 属性名 ("面板显示名称", 类型) = 默认值
_DiffuseColor ("漫反射颜色", Color) = (0, 1, 0, 1)
} SubShader
{
Tags
{
// Background(1000, 后台)、Geometry(2000, 几何体, 默认)、Transparent(3000, 透明)、Overlay(4000, 覆盖)
"Queue"="Background" // 渲染队列
}
Pass
{
ZTest Off // 关闭深度测试
Lighting On // 开启顶点光照
Material
{
Diffuse[_DiffuseColor] // 漫反射颜色
}
}
} Fallback "Diffuse"
}

​ 将 FixedShader_Sphere.shader 绑定的 Material 拖拽到 Sphere 游戏对象上。

​ 运行效果如下:

​ 声明:本文转自【Unity3D】固定管线着色器二

【Unity3D】固定管线着色器二的更多相关文章

  1. Shader基础(固定管线着色器)

    在Shader的编码中,要养成不加空格的习惯,否则会有时候出现一些错误 固定管线着色器: 优点:实现简单 缺点:处理的效果比较差 //设置Shader的路径 Shader "MyFixedS ...

  2. Unity3D ShaderLab 布料着色器

    Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...

  3. (原)Unreal渲染模块 管线 - 着色器(1)

    @author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...

  4. Unity3D内置着色器

    Unity内部提供了一些可以直接使用的着色器,这些内置着色器包括以下6个方面: (1)Performance of Unity shaders 着色器的性能和两个方面有关:shader本身和rende ...

  5. Unity3D学习笔记(三十四):Shader着色器(1)

    一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似.   GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模 ...

  6. 编写Unity3D着色器的三种方式

    不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...

  7. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  8. Unity3D Shader 学习笔记(二):ShaderLab的结构和基本属性

    (一) ShaderLab: 什么是ShaderLab: Unity3D支持的Shader种类包括: 1.Surface Shader:表面着色器 2.Vertex & Fragment Sh ...

  9. Shader开发之三大着色器

    固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader &qu ...

  10. [Unity] Shader(着色器)之固定管线

    在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...

随机推荐

  1. [转帖]如何在 Linux 中使用ss命令监控网络连接

    https://zhuanlan.zhihu.com/p/99421574 ss命令是用于在Linux系统上显示与网络套接字相关的信息的工具. 该工具显示netstat命令的更多详细信息,该命令用于显 ...

  2. [转帖]一份快速实用的 tcpdump 命令参考手册

    http://team.jiunile.com/blog/2019/06/tcpdump.html tcpdump 简介 对于 tcpdump 的使用,大部分管理员会分成两类.有一类管理员,他们熟知  ...

  3. [转帖]Python模块winRM

    https://www.jianshu.com/p/ac095497bad4 一.介绍 winRM服务是windows server下PowerShell的远程管理服务.Python脚本通过连接win ...

  4. [转帖]History of Web Browser Engines from 1990 until today

    https://eylenburg.github.io/browser_engines.htm Many tried, few remain... Last updated: January 2023 ...

  5. [转帖]CKA 真题

    https://segmentfault.com/a/1190000021380185   1.列出pod并排序 kubectl get pod --sort-by .metadata.name 题目 ...

  6. IIS 实现autoindex的简单方法 能够下载文件等.

    之前使用nginx 的autoindex on 的参数 能够实现了 nginx的 目录浏览查看文件 但是那是linux上面的 windows 上面很多 使用的 其实是 iis的居多 然后看了下 其实也 ...

  7. Linux 通过yum 方式离线下载依赖rpm包的操作步骤

    离线下载依赖rpm包的方法 1.简单获取依赖关系 yum deplist rpm-build 注意 deplist 为依赖项目 我在arm 上面简单跑一下结果为 package: rpm-build- ...

  8. 【原创】关于xenomai3 RTnet的一点记录

    xenomai3协议栈RTnet支持TCP.UDP,但不支持IGMP: 对ARP支持有限制:地址解析的延迟会影响数据包传输延迟,RTnet为实时性考虑,路由表设计静态的,只在设置期间配置,或者接收到其 ...

  9. 一种读取亿级doris数据库的方法

    工作中,常常需要将线上doris同步至集市.读取doris数据同读取常规mysql基本相同.如果数据行小于千万,比较简单的方式直接单节点连接.读取和存储.Python示例如下: def get_dat ...

  10. 错误的daemon.json配置,导致docker容器启动失败 Failed to start Docker Application Container Engine

    docker学习-配置错误的源 问题点剖析 参考 docker学习-配置错误的源 问题点剖析 使用docker安装了nginx,编写Dockerfile,映射端口,终于跑起来了.但是,当我重启服务器, ...