文章目录
在游戏开发和图形界面设计中,常常有在UGUI中渲染模型或特效的需求。当我们渲染的内容包含半透明效果时,和UI背景融合就成为一个难题,本文提供一种方法来来实现完美融合,该方法应用的前提是模型或特效的混合模式不能涉及DstColor或DstAlpha,在实际应用中几乎不会使用这类混合模式。
一、技术概述
1. UGUI
- UGUI 是 Unity 自带的一套 UI 系统,提供了丰富的组件和功能,方便开发者快速创建各种用户界面。
- UGUI 的渲染是在屏幕空间进行的,默认情况下不支持直接渲染到 RenderTexture。
2. RenderTexture
- RenderTexture 是一种特殊的纹理,可以作为渲染目标,将场景或物体渲染到其中。
- 通过将 UGUI 渲染到 RenderTexture,我们可以实现一些特殊的效果,如动态 UI、特效等。
3. 半透明效果与融合
- 半透明效果可以通过设置材质的透明度来实现,而与背景的融合则需要考虑渲染顺序、混合模式等因素。
二、实现步骤
该实例使用的版本为Unity 6000, 其他版本可能有细微差别。
1. 创建 RenderTexture
- 在 Unity 编辑器中,通过 “Assets - Create - Rendering - Render Texture” 创建一个新的 RenderTexture 资源。
- 设置 RenderTexture 的尺寸、格式等属性,以满足项目的需求。
2. 设置相机
- 创建一个新的相机,专门用于渲染 模型或特效 到 RenderTexture。
- 将相机的 Clear Flags 设置为 Solid Color,颜色设为RGBA(0,0,0,255)。
- 将相机的 Target Texture 设置为创建的 RenderTexture。
3. 创建特效
- 创建一个测试粒子,设置颜色为RGBA(252,82,4,255),并将Layer设置为UIEffect。
- 使用上步创建的相机渲染到RenderTexture。
4. RenderTexture 渲染到UGUI
- 创建UI背景,染色设为RGBA(128,128,128,255)。
- 创建一个RawImage,将步骤1创建的RenderTexture填入。
经过一番操作后,你获得的会是上面的样子,一个大大的黑底!
这显然不是我们想要的结果,下面将介绍如何实现完美的混合。
三、实现完美混合
1. 混合模式
Unity官网文档
不妨定义混合计算模式为 _BlendOp,颜色混合因子 _SrcBlend、_DstBlend,透明度混合因子 _SrcBlendA、_DstBlendA。其中源指当前片元着色器输出的值,目标指渲染缓冲当前记录的值。
则混合公式:
_FinColor = _SrcColor * _SrcBlend [ _BlendOp ] _DstColor * _DstBlend
_FinAlpha = _SrcAlpha * _SrcBlendA [ _BlendOp ] _DstAlpha * _DstBlendA
定义UI背景X, 要混合的半透明面片分别为A、B,为了便于理解先假定BlendOp都为加法运算,让我计算看最终的混合结果:
f 1 c o l o r = A c o l o r × A s r c B l e n d + X c o l o r × A d s t B l e n d f 1 a l p h a = A a l p h a × A s r c B l e n d A + X c o l o r × A d s t B l e n d A f 2 c o l o r = B c o l o r × B s r c B l e n d + f 1 c o l o r × B d s t B l e n d f 2 a l p h a = B a l p h a × B s r c B l e n d A + f 1 a l p h a × B d s t B l e n d A f1_{color} = A_{color}\times A_{srcBlend} + X_{color}\times A_{dstBlend} \\ f1_{alpha} = A_{alpha}\times A_{srcBlendA} + X_{color}\times A_{dstBlendA} \\ f2_{color} = B_{color}\times B_{srcBlend} + f1_{color}\times B_{dstBlend} \\ f2_{alpha} = B_{alpha}\times B_{srcBlendA} + f1_{alpha}\times B_{dstBlendA} \\ f1color=Acolor×AsrcBlend+Xcolor×AdstBlendf1alpha=Aalpha×AsrcBlendA+Xcolor×AdstBlendAf2color=Bcolor×BsrcBlend+f1color×BdstBlendf2alpha