【Unity3D】固定管线着色器二
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】固定管线着色器二的更多相关文章
- Shader基础(固定管线着色器)
在Shader的编码中,要养成不加空格的习惯,否则会有时候出现一些错误 固定管线着色器: 优点:实现简单 缺点:处理的效果比较差 //设置Shader的路径 Shader "MyFixedS ...
- Unity3D ShaderLab 布料着色器
Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth ...
- (原)Unreal渲染模块 管线 - 着色器(1)
@author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...
- Unity3D内置着色器
Unity内部提供了一些可以直接使用的着色器,这些内置着色器包括以下6个方面: (1)Performance of Unity shaders 着色器的性能和两个方面有关:shader本身和rende ...
- Unity3D学习笔记(三十四):Shader着色器(1)
一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似. GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模 ...
- 编写Unity3D着色器的三种方式
不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- Unity3D Shader 学习笔记(二):ShaderLab的结构和基本属性
(一) ShaderLab: 什么是ShaderLab: Unity3D支持的Shader种类包括: 1.Surface Shader:表面着色器 2.Vertex & Fragment Sh ...
- Shader开发之三大着色器
固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader &qu ...
- [Unity] Shader(着色器)之固定管线
在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...
随机推荐
- pycharm设置保存时自动格式化代码(Auto Reformat Code)
原文:https://blog.csdn.net/qq_41906934/article/details/124631826 1.手动格式化代码 Code -> Reformat Code 格式 ...
- 【MicroPython] 用 c 添加接口 -- 添加 module
[来源]https://www.eemaker.com/micropython-add-module.html
- JS - this 操作 dom , 添加样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- [转帖]存储器分级:L1 Cache 比内存和 SSD 快多少倍?
目录 1.为什么会有存储器分级策略? 2.存储器分级策略 2.1 存储器的级别 2.2.1 L1-Cache 2.2.2 L2-Cache 2.2.3 L3-Cache 3.内存 4.SSD 和硬盘 ...
- [转帖]Redis压力测试——redis-benchmark
liunx 安装 redis & redis benchmark 1.下载安装包 点击官网,下载stable版本 wget http://download.redis.io/releases/ ...
- Linux 排除某些目录下 重复jar包的方法
Linux 排除某些目录下 取重复jar包的方法 find . -path ./runtime/java -prune -o -name '*.jar' -exec basename {} \;| s ...
- PLC检测
填空题1 填空A-E 程序图一 第一训练题的程序,一个是用常开触点,一个是用上升沿指令,建议选上升沿指令编程 程序二 程序图三 程序四 程序五
- TienChin 活动管理-修改活动
后端 ChannelController.java @PreAuthorize("hasPermission('tienchin:channel:edit')") @GetMapp ...
- Mixed spaces and tabs
ykit打包过程中报错信息如下: 报错原因: Mixed spaces and tabs(混合空格和制表符). 大多数代码约定要求使用空格或 tab 进行缩进,因此,一行代码若同时混有 tab缩进和空 ...
- 基于50W携程出行攻略构建事件图谱(含码源):交通工具子图谱、订酒店吃饭事件图谱等
基于50W携程出行攻略构建事件图谱(含码源):交通工具子图谱.订酒店吃饭事件图谱等 项目构成 本项目由两个部分的组成,具体包括语料的获取以及基于语料的事件挖掘两个部分,具体项目目录包括: news_s ...