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

目录

一、前言

二、素材准备

三、准备基础代码

四、准备基础场景

五、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 面试【高难】

欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识: 聚类,可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法,可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯,可参考 sheng的学习笔记-AI-…

SpringBoot-SpringBoot中文文档

简介 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能,降低了复杂性,同时支持基于J…

DDMA信号处理以及数据处理的流程---跟踪

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…

基于Java游戏售卖网站详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

【Python实战因果推断】7_元学习器2

目录 X-Learner X-Learner X-learner 在解释上要比前一个学习器复杂得多,但其实现却非常简单,所以如果你一开始不理解,也不用担心。X 学习器有两个阶段和一个倾向得分模型。第一个阶段与 T 学习器相同。首先,将样本分为治疗组和…

深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径

文章目录 一、分批渲染1、setTimeout定时器分批渲染2、使用requestAnimationFrame()改进渲染2.1、什么是requestAnimationFrame2.2、为什么使用requestAnimationFrame而不是setTimeout或setInterval2.3、requestAnimationFrame的优势和适用场景 二、滚动触底加载数据三、Elemen…

【Python】已解决:ModuleNotFoundError: No module named ‘nltk‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ModuleNotFoundError: No module named ‘nltk‘ 一、分析问题背景 在Python编程中,我们常常需要使用第三方库来扩展语言的功能和应用场景。NLTK&am…

DP:解决路径问题

文章目录 二维DP模型如何解决路径问题有关路径问题的几个问题1.不同路径2.不同路径Ⅱ3.下降路径最小和4.珠宝的最高价值5.地下城游戏 总结 二维DP模型 二维动态规划(DP)模型是一种通过引入两个维度的状态和转移方程来解决复杂问题的技术。它在许多优化和…

Linux----> tail、cat、more、head、less的用法详解

1.tail命令&#xff1a;用于查看文件的最后几行内容。 基本用法&#xff1a;tail [选项] [文件] 常用选项&#xff1a; -n <行数>&#xff1a;显示最后的 <行数> 行。-f&#xff1a;实时显示文件新增内容&#xff0c;通常用于查看日志文件。 示例&#xff1a;…

算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法&#xff0c;它广泛应用于分类和回归问题中。它的核心思想是将复杂的决策过程分解成一系列简单的决…

JavaSE-面向对象(总结复习详细)

前言: 在 Java SE 中&#xff0c;面向对象编程是一种基本的编程范式&#xff0c;它将现实世界中的问题抽象成对象&#xff0c;然后通过对象之间的交互来解决问题。在面向对象编程中&#xff0c;所有的操作都是围绕对象展开的&#xff0c;对象拥有属性和行为&#xff0c;并且可…

MambaMixer:突破Transformers限制的高效深度学习架构

深度学习模型尤其是Transformers架构&#xff0c;已经在诸如自然语言处理、计算机视觉和时间序列预测等多个领域取得了显著成就。然而&#xff0c;随着模型输入序列长度的增加&#xff0c;传统的Transformers模型面临着显著的扩展性问题。其核心问题在于&#xff0c;Transforme…

GPT-5:编织未来智能的经纬

GPT-5技术突破预测 随着GPT-5的预告&#xff0c;人工智能的叙事正步入一个崭新的篇章。想象中的GPT-5不仅是自然语言处理&#xff08;NLP&#xff09;领域的革命&#xff0c;更是对“理解”本身的一次重新定义。它可能集成深度学习的最新进展&#xff0c;如自注意力机制的进一步…

Java访问修饰符的区别

public&#xff1a;公开的&#xff0c;任何地方都可以访问。 protected&#xff1a;受保护的&#xff0c;同一个包中的类和所有子类(可跨包)可以访问。 private&#xff1a;私有的&#xff0c;只有在同一个类中可以访问。 默认&#xff08;无修饰符&#xff09;&#xff1a;包级…

SmartEDA革新来袭:融合Multisim与Proteus精髓,引领电子设计新纪元!

在电子设计领域&#xff0c;每一次技术的革新都如同春风化雨&#xff0c;滋润着设计师们的心田。今天&#xff0c;我们迎来了一个划时代的电子设计自动化&#xff08;EDA&#xff09;工具——SmartEDA&#xff0c;它不仅融合了业界知名的Multisim和Proteus的精华&#xff0c;更…

【计算机毕业设计】077停车场微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

FreeRTOS移植到STM32

一、找一个STM32的裸机工程模板 我们以STM32F103裸机程序为例 随便找的一个裸机程序 二、去官网上下载FreeRTOS V9.0.0 源码 在移植之前&#xff0c;我们首先要获取到 FreeRTOS 的官方的源码包。这里我们提供两个下载 链 接 &#xff0c; 一 个 是 官 网 &#xff1a; http:…

若依 ruoyi 分离版 vue 简单的行内编辑实现

需要实现的效果&#xff1a;双击文本 - 修改文本 - 保存修改。 原码&#xff1a;仅文本显示文字内容 <el-table-column label"商品" align"center" prop"goodsName" width"200" v-if"columns[1].visible" /> 实现…

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

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