1 前言

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

2 正面与反面剔除

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

​ FixedShader.shader

  1. Shader "MyShader/ShaderTest"
  2. {
  3. Properties
  4. {
  5. // 属性名 ("面板显示名称", 类型) = 默认值
  6. _FrontColor ("正面颜色", Color) = (1, 0, 0, 1)
  7. _BackColor ("反面颜色", Color) = (0, 1, 0, 1)
  8. }
  9. SubShader
  10. {
  11. Pass
  12. {
  13. Lighting On // 开启顶点光照
  14. Cull Back // 剔除背面, 渲染正面
  15. Material
  16. {
  17. Diffuse[_FrontColor] // 漫反射光颜色
  18. }
  19. }
  20. Pass
  21. {
  22. Lighting On // 开启顶点光照
  23. Cull Front // 剔除正面, 渲染背面
  24. Material
  25. {
  26. Diffuse[_BackColor] // 漫反射光颜色
  27. }
  28. }
  29. }
  30. Fallback "Diffuse"
  31. }

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

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

3 Alpha 测试

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

​ FixedShader.shader

  1. Shader "MyShader/ShaderTest"
  2. {
  3. Properties
  4. {
  5. // 属性名 ("面板显示名称", 类型) = 默认值
  6. _AlphaThreshold ("Alpha阈值", Range(0, 1)) = 0.5
  7. _Texture2D ("2阶贴图", 2D) = "white" {}
  8. }
  9. SubShader
  10. {
  11. Pass
  12. {
  13. // Always Never Greater Less Equal GEqual LEqual NotEqual
  14. AlphaTest Greater [_AlphaThreshold] // 像素alpha值大于_AlphaThreshold才绘制, 否则不绘制
  15. SetTexture[_Texture2D]
  16. {
  17. Combine Texture
  18. }
  19. }
  20. }
  21. Fallback "Diffuse"
  22. }

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

4 深度测试

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

​ FixedShader.shader

  1. Shader "MyShader/ShaderTest"
  2. {
  3. Properties
  4. {
  5. // 属性名 ("面板显示名称", 类型) = 默认值
  6. _ShowColor ("显示颜色", Color) = (1, 0, 0, 1)
  7. _ShelterColor ("遮挡颜色", Color) = (0, 1, 0, 1)
  8. }
  9. SubShader
  10. {
  11. Pass
  12. {
  13. // Always Never Greater Less Equal GEqual LEqual NotEqual
  14. ZTest Greater // 大于或等于当前深度才通过深度测试, 绘制像素, 否则不绘制
  15. ZWrite Off // 关闭深度缓存
  16. Lighting On // 开启顶点光照
  17. Material
  18. {
  19. Diffuse[_ShelterColor] // 被遮挡时渲染绿色
  20. }
  21. }
  22. Pass
  23. {
  24. ZTest LEqual // 小于当前深度才通过深度测试, 绘制像素, 否则不绘制
  25. Lighting On // 开启顶点光照
  26. Material
  27. {
  28. Diffuse[_ShowColor] // 没被遮挡时渲染红色
  29. }
  30. }
  31. }
  32. Fallback "Diffuse"
  33. }

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

5 混合

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

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

​ 混合因子如下:

  1. // 源颜色为: (sR, sG, sB, sA), 目标颜色为: (dR, dG, dB, dA)
  2. Zero // (0, 0, 0, 0)
  3. One // (1, 1, 1, 1)
  4. SrcColor // (sR, sG, sB, sA)
  5. DstColor // (dR, dG, dB, dA)
  6. OneMinusSrcColor // (1, 1, 1, 1) - (sR, sG, sB, sA)
  7. OneMinusDstColor // (1, 1, 1, 1) - (dR, dG, dB, dA)
  8. SrcAlpha // (1, 1, 1, 1) * sA
  9. DstAlpha // (1, 1, 1, 1) * dA
  10. OneMinusSrcAlpha // (1, 1, 1, 1) * (1-sA)
  11. OneMinusDstAlpha // (1, 1, 1, 1) * (1-dA)
  12. SrcAlphaStaturate // (1, 1, 1, 1) * min(sA, 1-dA)

​ FixedShader.shader

  1. Shader "MyShader/ShaderTest"
  2. {
  3. Properties
  4. {
  5. // 属性名 ("面板显示名称", 类型) = 默认值
  6. _DiffuseColor ("漫反射颜色", Color) = (0, 1, 0, 0.5)
  7. }
  8. SubShader
  9. {
  10. Pass
  11. {
  12. Blend SrcAlpha OneMinusSrcAlpha // 透明混合
  13. Lighting On // 开启顶点光照
  14. Material
  15. {
  16. Diffuse[_DiffuseColor] // 漫反射颜色
  17. }
  18. }
  19. }
  20. Fallback "Diffuse"
  21. }

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

6 渲染队列

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

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

​ FixedShader_Cube.shader

  1. Shader "MyShader/ShaderTest_Cube"
  2. {
  3. Properties
  4. {
  5. // 属性名 ("面板显示名称", 类型) = 默认值
  6. _DiffuseColor ("漫反射颜色", Color) = (1, 0, 0, 1)
  7. }
  8. SubShader
  9. {
  10. Tags
  11. {
  12. // Background(1000, 后台)、Geometry(2000, 几何体, 默认)、Transparent(3000, 透明)、Overlay(4000, 覆盖)
  13. "Queue"="Transparent" // 渲染队列
  14. }
  15. Pass
  16. {
  17. ZTest Off // 关闭深度测试
  18. Lighting On // 开启顶点光照
  19. Material
  20. {
  21. Diffuse[_DiffuseColor] // 漫反射颜色
  22. }
  23. }
  24. }
  25. Fallback "Diffuse"
  26. }

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

​ FixedShader_Sphere.shader

  1. Shader "MyShader/ShaderTest_Sphere"
  2. {
  3. Properties
  4. {
  5. // 属性名 ("面板显示名称", 类型) = 默认值
  6. _DiffuseColor ("漫反射颜色", Color) = (0, 1, 0, 1)
  7. }
  8. SubShader
  9. {
  10. Tags
  11. {
  12. // Background(1000, 后台)、Geometry(2000, 几何体, 默认)、Transparent(3000, 透明)、Overlay(4000, 覆盖)
  13. "Queue"="Background" // 渲染队列
  14. }
  15. Pass
  16. {
  17. ZTest Off // 关闭深度测试
  18. Lighting On // 开启顶点光照
  19. Material
  20. {
  21. Diffuse[_DiffuseColor] // 漫反射颜色
  22. }
  23. }
  24. }
  25. Fallback "Diffuse"
  26. }

​ 将 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. 【VSCode】秒下vscode

    有时从vscode官网下载速度奇慢甚至失败,介绍一种方法可以秒下 进入官网选择要下载的版本 像我的电脑,下载网址根本打不开 修改下载网址,替换下载地址中红框字符串:vscode.cdn.azure.c ...

  2. [转帖]Nginx中absolute_redirect、port_in_redirect配置简述

    一.背景: 我们在访问nginx代理下的项目前端页面时,经常会有访问链接最末尾带不带'/'的问题,当我们访问http://xxxx/home时,如果匹配不到location,会自动加上端口port以及 ...

  3. SQLServer解决deadlock问题的一个场景

    SQLServer解决deadlock问题的一个场景 背景 公司产品出现过很多次dead lock 跟研发讨论了很久, 都没有具体的解决思路 但是这边知道了一个SQLServer数据库上面计划100% ...

  4. [转帖]HAProxy 在 TiDB 中的最佳实践

    https://docs.pingcap.com/zh/tidb/stable/haproxy-best-practices 本文介绍 HAProxy 在 TiDB 中的最佳配置和使用方法.HAPro ...

  5. [转帖]深入了解 gRPC:协议

    https://cn.pingcap.com/blog/grpc 经过很长一段时间的开发,TiDB 终于发了 RC3.RC3 版本对于 TiKV 来说最重要的功能就是支持了 gRPC,也就意味着后面大 ...

  6. [转帖]Linux终端:用cat命令查看不可见字符

    https://developer.aliyun.com/article/80607 printf 'testing\012\011\011testing\014\010\012more testin ...

  7. [转帖]《Linux性能优化实战》笔记(22)—— 网络丢包问题分析

    所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了.这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率.丢包率是网络性能中最核心的指标之一.丢包通常会 ...

  8. [转帖]gcc与makefile常用操作(绝对常用,也绝对够用)

    makefile与gcc常用操作 一.温故知新 1.可执行程序的生成过程 2.gcc的常用操作 二.make操作 三.编写Makefile文件时常用操作 注意:在Makefile文件中 空格和缩进是完 ...

  9. [转帖]深度解读:传奇的Alpha处理器

    https://jishuin.proginn.com/p/763bfbd2cf85 来源:科技新报(台) 长期关心处理器技术发展者,这20年来,很难不每隔一段时间就会偶尔听到「这技术受Alpha影响 ...

  10. Linux 环境下 node 以及 jit 的简单环境配置说明

    注意事项: 1. 注意这个包需要实时更新. 2. 更新时需要按照目录覆盖文件. 3. 谁负责谁治理的态度, 有更新,需要完整的进行覆盖安装. 建议先删除旧文件, 替换新文件. 4. 为了简单起见, 直 ...