Unity | Shader基础知识(第十五集:透明效果)

news2024/10/7 16:24:53

目录

一、前言

二、素材准备

三、准备基础代码

四、准备基础场景

五、SurfaceOutput结构体

六、透明度

七、渲染顺序

八、选错的后果

九、Tags之渲染顺序

十、Cull(正面和反面渲染)

十一、代码汇总

十二、作者的碎碎念


一、前言

因为shader这个专题得到了大家的支持,所以目前在继续更新下去。

之前一直讲的都是rgb模式,我们一直没有带着a玩,因为透明模式和其他的稍微有些不太一样。

二、素材准备

首先我们需要准备一个透明贴图,如果你实在没有,可以选择去

FreePNG | FreePNG is a free to use PNG gallery where you can download high quality transparent PNG images.

不需要账号,直接找一个喜欢的下载就行了,我下载了(如图1所示)

图1 一个树

三、准备基础代码

前面讲过的肯定不能再讲了,我们是在这个代码的基础上进行的。

Shader "Custom/011"
{
    Properties
    {
        _MainTex ("MainTex", 2D) = "white" {}
    }
    SubShader
    {
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

四、准备基础场景

我们拿3D物体中的Quad来做放置的物体。

注释:这里给大家解释一下,为什么不用plane?

plane: 是由很多个三角形组成的矩形,所以在显示地面的时候可以显示的比较细致,但费性能。

Quad:只有两个三角形组成的矩形,所以一般用来放视频之类的,对细节没太多要求的平面,没那么费性能。

图2 基础场景

五、SurfaceOutput结构体

如果你仔细注意,本次准备的基础代码,有一个新的结构体,和以前用过的只有一个单词的差距,但比那个简单(也可以用上一个,这不是给大家多练习几个吗,嘿嘿)。具体可以查询以下链接。

编写表面着色器 - Unity 手册

struct SurfaceOutput
{
    fixed3 Albedo;  // 贴图颜色
    fixed3 Normal;  // 法线
    fixed3 Emission;//自发光
    half Specular;  // 0..1 范围内的镜面反射能力
    fixed Gloss;    // 镜面反射强度
    fixed Alpha;    // 透明度 Alpha
};

我们可以观察到,这里面专门有一个透明度的信息,所以我们的第一个目标就是,把透明度先放进去。 

六、透明度

我们改一下surf中的内容,把导入进来的贴图信息,分成两份,一份给贴图颜色,一份给透明度。

        void surf (Input IN, inout SurfaceOutput o)
        {
            //我们新建一个fixed4 把转换的所有的颜色信息都接进来
            fixed4 c =tex2D (_MainTex, IN.uv_MainTex);
            //我们把rgb给了贴图
            o.Albedo = c.rgb;
            //把透明度给alpha
            o.Alpha = c.a;
        }

虽然代码已经写好了,可以写入进去,但到此为止,我们的透明是没有打开的,因为透明的种类有很多,需要我们标注一下

透明的种类(猫一眼就行了,知道有很多种就行了):

alphaalpha:auto - 自动选择

1.普通光照情况,选择alpha:fade

2.基于物理光照情况,选择alpha:premul

alpha:blend - 启用alpha混合。

alpha:fade - 最常见的透明度

alphatest:VeriableName(alphatest:变量名) - 启用alpha cutout transparency(alpha剔除透明)。剔除变量是用float数值。您可能还想使用addshadow指令来生成正确的阴影投影器的pass。

keepalpha - 用于默认不透明的surface shader。 无论输出结构体的alpha值是什么,或者光照函数返回什么,始终写入alpha通道值为1.0(白色)。

decal:add - 叠加性的decal(贴花)shader(如:地形shader的AddPass)。意思就一个对象的表面在另一个对象表面上使用了additive混合

decal:blend - 半透明的贴花shader。意思就一个对象的表面在另一个对象表面上使用了alpha混合。

总结一下,我们目前最常见的需求是alpha:fade,所以我们无脑选这个,其他我们未来再讲。

 写的位置,这个标注的位置在我们引用的后面

#pragma surface surf Lambert alpha:fade

 然后,我们就得到了一张透明的树(如图3所示)

图3 透明的树

七、渲染顺序

因为有了透明,所以渲染顺序就变得重要起来了。以前都是实心的,就没那么重要。

什么叫渲染顺序?

就是计算机画画的顺序。

人可以做到看到什么画什么,但计算机不能,它会一股脑全画上去,那就涉及到一个问题,遮挡关系怎么办?

所以利用画画的顺序,就可以实现遮挡。

感觉很像下面这个视频,就是一层一层盖上去的。 

【油画棒】白蔷薇~沉浸式教程_哔哩哔哩_bilibili

如果你看了这个教程,就会知道,如果我先画花,再画背景,花肯定就看不见了,没了! 

计算机的渲染顺序是这样的:

  • Background:背景,数值为1000,先画背景,没毛病吧!
  • Geometry:不透明物体,数值为2000
  • AlphaTest:需要进行透明度测试的物体,数值为2450(有些透明设置的比较复杂,计算机也不太确认,所以先测试一下,万一它属于不透明呢?)
  • Transparent:一定有透明的物体,数值为3000
  • Overlay:叠加效果,数值为4000(如镜头光晕)

所以一般是让你选择的。(如图4所示)

图4 选择菜单

如果你仔细看图了,你会发现三件事。

1.background和overlay是不给你在这选的。

2.上面的数值是什么意思?

3.fromShader是什么意思? 

虽然看上去是选项,但实际上是按数值控制的,

如果都是不透明的物体,你也可以通过填写数值,选择先渲染哪个,再渲染哪个。

FromShader的意思就是,我不做选择,我直接填数。

上面的选项和数值其实就是软件给你先填了个数字,大概分了个类。

备注:如果你选了geometry,但是数值写了1000,他俩不匹配,那会按照geometry来渲染,总之就是类别为主要影响,数值是在类别相同的情况下细分。。

八、选错的后果

我们的树是透明物体,但我就想选成不透明的,你会发现,如果我把球一直往后挪,它会在相机里面突然渲染到前面。(如图5所示)

图5 出现渲染错误

解决方案,就是(如图6所示),调对就可以了。

图6 调选项

九、Tags之渲染顺序

这个里面有很多,我们暂时只讲渲染顺序。

我们除了可以在外面手动去选择渲染顺序,我们也可以自己在代码里面写好,有一些可以事先标注的内容,会放在Tags里。

顺序的单词是:Queue

顺序选择透明就写成:“Queue”=“Transparent”

如果选其他的,后面那个Transparent,就写别的。

代码如下:

    Tags
    {
        "Queue" = "Transparent"
    }

这时候你会发现,你的fromShader会自动变成Transparent的数值。(如图7所示)

图7 FromShader数值

十、Cull(正面和反面渲染)

所有的模型,包含图片,在Unity中,都是有正面和反面一说的。

对于图片来说,背面就是反面(如图8所示)。翻到反面,默认就会看不见。

图8 图片背面

对于模型来说,内部就是反面。我们只能看见外面。(如图9所示)

 摄像机移动到球体内部,就看不见了,因为和图片一样,反面不显示。

图9 摄像机移到球内

如果你希望看见,你就要在shader里面加代码。

Cull Back(默认):         只显示正面,不显示背面
Cull Front:                    只显示背面,不显示正面
Cull Off                           都显示

备注:Cull的中文意思叫做剔除,cull off就是都剔除的意思

 所以我们在代码里加上。

 SubShader
    {
        Tags
        {
        "Queue" = "Transparent"
        }
        
        //加在这个位置就可以了
        Cull Off

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade

 然后你就会拥有一个,正反面的树。(如图10所示)

图10 正反面的树

十一、代码汇总

本节课所有代码如下,方便你们参考比对。

Shader "Custom/011"
{
    Properties
    {
        _MainTex ("MainTex", 2D) = "white" {}
    }
    SubShader
    {
        //Tags放在这里哦
        Tags
        {
        "Queue" = "Transparent"
        }

        Cull Off

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade
        sampler2D _MainTex;
        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            //我们新建一个fixed4 把转换的所有的颜色信息都接进来
            fixed4 c =tex2D (_MainTex, IN.uv_MainTex);
            //我们把rgb给了贴图
            o.Albedo = c.rgb;
            //把透明度给alpha
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

十二、作者的碎碎念

不知不觉已经更新十五集了,非常感谢大家一如既往的支持~up会继续努力更新下去的!~

另外,up已经同步对这个专题进行了视频录制,视频更新的要比文章慢,如果想看视频,大家也可以支持一下~视频已经更新了十二集了。

Unity 什么是shader第一集_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1876017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-斐波那契数列

[题目描述] 斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都等于前面 2个数之和。 给出一个正整数 a,要求斐波那契数列中第 a 个数是多少。输入: 第 1 行是测试数据的组数 n,后面跟着 n 行输…

UnityShader SDF有向距离场简单实现

UnityShader SDF有向距离场简单实现 前言项目场景布置连连看画一个圆复制一个圆计算修改shader参数 鸣谢 前言 突然看到B站的一个教程,还不错,记录一下 项目 场景布置 使用ASE连连看,所以先要导入Amplify Shader Editor 连连看 画一个…

有人问周鸿祎: 学历不重要,为什么360只要985和211?

关注、星标公众号,直达精彩内容 有人问周鸿祎:你说学历不重要,为什么360招聘的人才只要985和211?他说这个事情,我专门问了我们的人力资源,我们的干品分为校园招聘和社会招聘 校园招聘的话会看文凭 社会招聘的话&#x…

性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!

文章目录 一、什么是垃圾回收二、Java 内存区域划分三、垃圾回收算法1. 标记-清除(Mark-Sweep)算法2. 复制(Copying)算法3. 标记-整理(Mark-Compact)算法4. 分代收集(Generational Collecting&a…

光储充一体化解决方案

慧哥充电桩开源平台V2.5.2_ 【源码下载】 https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001.5502 本文从光储充的原理以及总体系统等角度,全方位介绍光储充一体化解决方案实例。 一、典型应用场景 针对整县区域光伏项目,在…

综合评价类模型——突变级数法

含义 首先:对评价目标进行多层次矛盾分解其次:利用突变理论和模糊数学相结合产生突变模糊隶属函数再次:由归一公式进行综合量化运算最终:归一为一个参数,即求出总的隶属函数,从而对评价目标进行排序分析特点…

c++指针和引用之高难度(二)习题讲解

1.【单选题】 int a[4] { 1001,1002,1003,1004 }; int* p{ &a[1] }; p[1] ? A 1001 B 1002 C 1003 解析:这道题考察了指针和数组可以混用。p 指向了 数组 a[0] 的地址,也就是 1002 的地址,此时 *p p[0]…

DDPM pytorch 代码复现

本次只分享代码以及效果,后续更新原理 代码参考 deep_thought 先看动图效果 1.选择一个数据集 %matplotlib inline import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import make_s_curve import torchs_curve, _ make_s_curve(10 **…

零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算 四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式 五.CubeMX配置一个ADC采集例程六.CubeMX工程源…

通天星CMSV6车载监控平台CompanyList信息泄露漏洞

1 漏洞描述 通天星CMSV6车载视频监控平台是东莞市通天星软件科技有限公司研发的监控平台,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。通天星科技应用于公交车车载、校车车载、大巴车车载、物流车载、油品运输车载、警车车…

风控图算法之中心性算法(小数据集Python版)

风控图算法之中心性算法(小数据集Python版) 图算法在金融风控领域的应用已经超越了传统的社区发现技术,这些技术曾被主要用于识别和分析欺诈性行为模式,例如黑产团伙。当前,一系列图统计算法,包括介数中心…

笔记本重装系统怎么操作? windows电脑重装系统,超实用的四种方法

重新安装操作系统是维护计算机性能和确保系统稳定运行的重要步骤。对于 Windows 笔记本用户而言,熟悉重装系统的方法可以帮助他们解决各种问题,从提高系统速度到修复软件故障。然而具体来讲,笔记本重装系统怎么操作呢?接下来&…

【01】Java代码如何运行

JRE: 包含Java虚拟机以及核心类库 JDK: 同样包含了JRE,并且附带了一系列开发、诊断工具 一、为什么Java要在虚拟机中运行 一、 Java语言特性:高级、语法复杂、抽象 Java语言-- 【编译器】 --> Java字节码 --【虚拟机】–> 实现 二、 托管环境 自…

正点原子rk3588编译sdk

1、编译SDK 1.1 安装 RK3588 Linux SDK .repo/repo/repo sync -l -j101.2 SDK 工程目录介绍 app:存放上层应用 app,包括 Qt 应用程序,以及其它的 C/C应用程序。 buildroot:基于 buildroot 开发的根文件系统。 debian&#xff1…

AIGC对图片行业的影响分析!

前言 自从去年生成式AI火起来之后,不论是文字领域还是图片领域受到的冲击都非常大。比如说SD和Midjourney的爆火,不止是创作者,还有交易平台和使用方,都在发生变化。 AIGC自2023年全面进入大家视野,对各行各业造成了或…

论证型大语言模型:促进可解释性与可质疑的决策制定

Argumentative Large Language Models for Explainable and Contestable Decision-Making 论文地址: https://arxiv.org/abs/2405.02079https://arxiv.org/abs/2405.02079 1.概述 在探讨大型语言模型(LLMs)在决策支持系统中的应用时,我们需正视其面临的核心问题。这些问题…

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数(重点) 二、MySQL的窗口函数(重点) 三、MySQL的视图(熟悉) 四、MySQL的事务(熟悉) 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…

基于Vue,mysql,JavaEE的简单投票与投票管理系统

项目介绍 ​ 本项目,基于Vue2.6,mysql,JavaEE 实现简单的投票与投票管理系统 项目地址 VotingSystem: 投票系统1.0 管理员和普通用户 (gitee.com) 有问题请评论私聊哦 项目分类 数据库 创建投票人,被投票人,投票关系(追踪谁…

python基础语法 003-4 数据类型集合

1 集合 1.1 什么是集合 什么是集合?ANS:集合set是一个无序的不重复元素序列集合怎么表示?ANS: {} , 用逗号隔开打印元组类型,type()一个元素的集合怎么表示?:ANS:存储多种类型{"a", 1} """…

海外媒体发稿:2个必选媒体宣发套餐引爆影响力-华媒舍

本文旨在介绍2个必选媒体宣发套餐的特点及其如何引爆影响力。 在当今竞争激烈的媒体环境中,有效的宣传和推广策略对于企业和个人的成功至关重要。这就是为什么选择正确的宣发套餐成为了一个关键的决策。 2. 媒体宣发套餐概述 媒体宣发套餐是一种综合性的宣传方案&…