UnityShader(十七)透明效果

2024-03-19 09:20

本文主要是介绍UnityShader(十七)透明效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

在实时渲染中实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,一个物体被渲染到屏幕上时每个片元除了颜色值和深度值外,还有一个透明值,1表示像素完全不透明,0表示完全透明。

Unity中通常有两种方法实现透明效果:

1.使用透明测试(Aplha Test),这种方法其实无法实现真正的半透明效果

2.透明度混合(Alpha Blending)

透明度测试

只要一个片元的透明度不满足条件,那么它对应的片元就会被舍弃。被舍弃的片元不会进行任何处理,也不会对颜色缓冲区有任何影响,否则就会按照普通的不透明物体的处理方式进行处理,即进行深度测试、深度写入等。

也就是书透明度测试不需要关闭深度写入,它和其它不透明物体最大的不同就是它会根据透明度来舍弃一些偏远。但是这种效果很极端,要么完全透明,要么完全不透明,也就不能够实现半透明的效果

透明度混合

这种方法可以实现真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储再颜色缓冲中的颜色值进行混合,得到新的颜色。

但是透明度混合需要关闭深度写入,这需要我们小心物体的渲染顺序。但需要注意的是,透明度混合只是关闭了深度写入,但不会关闭深度测试。

渲染顺序的重要性

对于游戏物体都是不透明物体来说,渲染顺序不是很重要,因为强大的深度测试会解决游戏物体的前后关系。

假设现在场景中有两个物体A和B,A为半透明物体,B为透明物体,且A在B的前面。

第一种情况:我们先渲染B,再渲染A。呢么由于不透明物体开启了深度测试和深度写入,而此时深度缓存中没有任何数据,那么B就会被写入颜色缓冲区和深度缓冲区。随后再渲染A,透明物体会进行深度测试但不会深度写入,所以在渲染出的图像中我们发现B会比A距离摄像机更近,我们会使用A的透明度来和颜色缓冲中的B的颜色进行混合,得到真正的半透明物体。

第二种情况:我们先渲染A,再渲染B。渲染A时深度缓冲区没有任何有效数据(因为透明物体是不需要深度写入的),因此A直接写入颜色缓冲中,但不会修改深度缓冲。等到渲染B时,B会进行深度测试直接通过,那么它的颜色就会被直接写入颜色缓冲中,结果就是B的颜色会直接覆盖颜色缓冲中A的颜色,从视觉上来看,B出现在A的前面,这是错误的。

同样,现在假设A和B都是半透明物体,且A在B前面。

第一种情况:先渲染B再渲染A。那么B会正常写入颜色缓冲,然后A会和颜色缓冲中B颜色进行混合,得到正确的半透明效果。

第二种情况:先渲染A再渲染B。那么A会正常写入颜色缓冲,然后B会和颜色缓冲中A颜色进行混合,这样结果就相反了过来,得到错误的结果(B看起来像是在A前面)

UnityShader的渲染顺序

Unity为了解决渲染顺序问题提供了渲染队列(render queue)的解决方案,我们可以使用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列。Unity在内部使用一系列整数索引来表示每个渲染队列,且索引越小表示越先被渲染。

这篇关于UnityShader(十七)透明效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/825507

相关文章

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Python实现生命之轮Wheel of life效果

《使用Python实现生命之轮Wheeloflife效果》生命之轮Wheeloflife这一概念最初由SuccessMotivation®Institute,Inc.的创始人PaulJ.Meyer... 最近看一个生命之轮的视频,让我们珍惜时间,因为一生是有限的。使用python创建生命倒计时图表,珍惜时间

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案(Pattern)填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思路,多边形的斜线填充应该属于“多边形与折线的布尔运算”范畴。 第一个问题是如何获得斜线,这条斜线应该满足什么样

AF透明模式/虚拟网线模式组网部署

透明模式组网 实验拓扑  防火墙基本配置 接口配置 eth1  eth3   放通策略  1. 内网用户上班时间(9:00-17:00)不允许看视频、玩游戏及网上购物,其余时 间访问互联网不受限制;(20 分) 应用控制策略   2. 互联网用户只允许访问内网两台服务器的 WEB、SSH 和远程桌面服务,其余 服务均不允许访问;(20 分) 外网访问内网的限制策略   虚拟网线模式组网 实