Unity3d Shader篇(十三)— 透明度混合(AlphaBlend)

news2024/11/19 9:19:10

文章目录

  • 前言
  • 一、什么是透明度混合?
    • 1. 透明度混合原理
    • 2. 透明度混合优缺点
        • 优点:
        • 缺点:
    • 3. 纹理图
  • 二、使用步骤
    • 1. Shader 属性定义
    • 2. SubShader 设置
    • 3. 渲染 Pass
    • 4. 定义结构体和顶点着色器函数
    • 5. 片元着色器函数
  • 三、效果
  • 四、总结


前言

在计算机图形学中,透明度混合(AlphaBlend)是一种常用的技术,用于实现透明效果。透明度混合允许将半透明物体与场景进行混合,以产生逼真的视觉效果。在Unity中,通过编写Shader可以实现透明度混合效果,本篇博客将介绍如何在Unity中使用Shader实现透明度混合效果。


一、什么是透明度混合?

1. 透明度混合原理

透明度混合(Alpha blending)是一种图形渲染技术,用于在渲染半透明物体时将其颜色与背景进行混合,从而产生透明效果。在透明度混合中,每个像素的输出颜色是由物体颜色和背景颜色按照一定比例混合而成,这一比例通常由物体的透明度值(Alpha值)来控制。

透明度混合的工作原理是将半透明物体的颜色与场景中已经存在的颜色进行混合,从而实现透明效果。在渲染过程中,透明度混合通常涉及两个关键步骤:关闭深度写入和设置混合模式。

2. 透明度混合优缺点

优点:

实现透明效果: 透明度混合可以有效地模拟透明物体的视觉效果,使其能够与背景进行逼真的混合,从而呈现出真实的透明感。
增加场景细节: 通过透明度混合,可以在场景中添加半透明的物体,如玻璃、水面等,从而增加场景的丰富程度和细节感。
增强视觉效果: 透明度混合可以用于创建视觉效果,如烟雾、光线透射等,使场景更加生动和引人注目。

缺点:

性能开销: 透明度混合需要对每个像素进行混合计算,这可能会增加渲染的计算开销,尤其是在有大量透明物体的场景中。
深度排序问题: 当存在多个半透明物体时,需要对它们进行正确的深度排序以避免渲染顺序错误导致的混合错误。这一过程可能会增加开发复杂度并影响渲染性能。
图像质量损失: 透明度混合可能导致图像质量损失,特别是在有大量透明物体重叠的情况下,可能会出现颜色混合不均匀、边缘虚化等问题,影响视觉效果

3. 纹理图

在这里插入图片描述

二、使用步骤

1. Shader 属性定义

// 定义属性
Properties {
	//主纹理贴图
	_MainTex("Main Texture", 2 D) = "white" {}
	// 漫反射颜色属性,默认白色
	_Diffuse("Diffuse Color", Color) = (1, 1, 1, 1)
	// 透明度阈值
	_AlphaScale("Alpha Scale",Range(0,1))=1
}

2. SubShader 设置

SubShader
{
    Tags
    {
        "Queue" = "Transparent" // 渲染队列为AlphaTest
        "IgnoreProjector" = "True" // 忽略投影
        "RenderType"="Transparent"
    }
    
    LOD 100 // 细节级别
    //关闭深度写入
    ZWrite Off
    //开启混合
    Blend SrcAlpha OneMinusSrcAlpha
}

这段代码定义了一个透明材质的SubShader,其中设置了渲染队列为AlphaTest,忽略投影,使用了透明渲染类型,并关闭了深度写入并开启了混合

3. 渲染 Pass

Pass
{
	Tags
    {
        "LightMode"="ForwardBase"
    }
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    // 包含Unity CG库
    #include "UnityCG.cginc"
    // 包含光照CG库
    #include "Lighting.cginc"

    // 漫反射颜色属性
    fixed4 _Diffuse;
    // Alpha阈值
    float _AlphaScale;

    // 主纹理贴图
    sampler2D _MainTex;
    float4 _MainTex_ST;

}

这里开始了渲染 Pass 部分。在这里,我们使用了 CGPROGRAM 指令来声明顶点着色器和片元着色器函数。#pragma vertex vert#pragma fragment frag 分别指定了顶点着色器函数和片元着色器函数的名称。

然后,我们包含了 UnityCG.cgincLighting.cginc,它们提供了许多有用的函数和宏,用于简化编写 Shader。

4. 定义结构体和顶点着色器函数

// 定义结构体:从顶点到片段的数据传递
struct v2f {
	float4 vertex: SV_POSITION; // 顶点位置
	fixed3 worldNormal: TEXCOORD0; // 世界空间法线
	fixed3 worldPos: TEXCOORD1; // 世界空间位置
	float2 uv: TEXCOORD2; // 纹理坐标
};

// 顶点着色器函数
v2f vert(appdata_base v) {
	v2f o;
	o.vertex = UnityObjectToClipPos(v.vertex); // 顶点位置变换到裁剪空间
	fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); // 世界空间法线
	o.worldNormal = worldNormal;

	// 让外部的属性可以影响到uv
	//o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
	// 简化uv计算函数
	o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

	o.worldPos = mul(unity_ObjectToWorld, v.vertex);
	return o;
}

这个顶点函数的主要功能是将输入的顶点数据从对象空间转换到裁剪空间,并为后续的渲染过程提供必要的信息,包括裁剪空间中的顶点位置、世界空间中的法线、纹理坐标以及顶点的世界空间位置。

5. 片元着色器函数

// 片元着色器函数
fixed4 frag(v2f i): SV_Target {
	// 获取环境光
	fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

	// 纹理采样
	fixed4 texColor = tex2D(_MainTex, i.uv);

	// 漫反射
	// 获取光源方向
	//fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
	// 简化获取光源方向
	fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
	fixed3 diffuse = _LightColor0.rgb * texColor.rgb * _Diffuse.rgb * (dot(worldLightDir, i.worldNormal) *
		0.5 + 0.5);

	// 组合最终颜色
	fixed3 color = diffuse + ambient;
	return fixed4(color, texColor.a * _AlphaScale); // 输出颜色
}

这段代码是一个片元着色器函数,负责计算每个像素的最终颜色输出。首先,从环境光中获取基础颜色值。然后,从_MainTex纹理中采样颜色值。接着,计算漫反射部分,通过获取光源方向和表面法线的点积来模拟光照对表面的影响。最后,将漫反射颜色和环境光颜色相加,乘以纹理的alpha值,并返回作为输出颜色。

三、效果

在这里插入图片描述

四、总结

Unity 中的透明度混合(Alpha Blend)是一种常用的图形渲染技术,它允许将半透明的对象与场景中的其他对象进行混合,以创建逼真的图形效果。以下是关于 Unity 中透明度混合的总结:

基本概念:
透明度混合是指将具有不同透明度的像素合成到最终图像中的过程。
透明度(Alpha)通常表示物体的不透明度,值从 0(完全透明)到 1(完全不透明)。

混合模式:
Unity 支持多种混合模式,包括透明度混合(Alpha Blend)、加法混合(Additive Blend)、乘法混合(Multiplicative Blend)等。
在透明度混合中,新像素的颜色将与背景像素的颜色根据其 Alpha 值进行插值计算,产生最终的颜色。

透明度排序:
在使用透明度混合时,需要正确地排序渲染顺序,以确保透明对象正确地叠加在不透明对象之上。
Unity 中可通过设置渲染顺序(Sorting Order)或手动控制渲染队列(Rendering Queue)来实现透明度排序。

性能考虑:
透明度混合可能会对性能产生一定影响,特别是在移动设备上。
过度使用透明度混合可能导致额外的 GPU 开销,降低渲染性能。

材质设置:
在 Unity 中,可以通过调整材质的 Shader 来控制透明度混合效果。
内置的 Standard Shader 和 Universal Render Pipeline(URP)中的 Lit Shader 都支持透明度混合。

透明度剔除:
透明度剔除(Alpha Cutoff)是一种优化技术,可以根据像素的 Alpha 值进行丢弃,以减少不必要的像素处理。
透明度剔除常用于处理带有透明部分的纹理,如树叶或草地。
总的来说,透明度混合是 Unity 中实现半透明效果的重要技术之一,合理使用并结合透明度排序和性能优化技巧,可以有效地创建逼真的图形效果,并确保良好的性能表现。

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

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

相关文章

ArmSoM Rockchip系列产品 通用教程 之 PCIe 使用

1. PCIe 简介​ PCIe(Peripheral Component Interconnect Express)是一种用于连接主板和外部设备的高速串行接口标准。它是 PCI 技术的后继者,旨在提供更高的带宽和更好的性能。 高速传输: PCIe接口提供了高速的数据传输通道&am…

【STA】SRAM / DDR SDRAM 接口时序约束学习记录

1. SRAM接口 相比于DDR SDRAM,SRAM接口数据与控制信号共享同一时钟。在用户逻辑(这里记作DUA(Design Under Analysis))将数据写到SRAM中去的写周期中,数据和地址从DUA传送到SRAM中,并都在有效时…

使用QEMU来模拟运行Linux系统

第一步:安装 执行命令 假设我们呢开发板需要arm64架构的Ubuntu 得通过apt-file去找,可以找到qemu-system-arm 所以直接按照qemu-system-arm就行了 apt-file list会列举这个软件包里所有的文件 这个命令可以列举出所有安装好的包名,有点像pip…

什么是PLC远程控制模块?

随着工业自动化的不断发展,可编程逻辑控制器(PLC)已成为现代工业设备中不可或缺的核心组件。然而,传统的PLC管理方式往往受限于现场操作和维护,难以满足日益复杂的工业需求。在这一背景下,PLC远程控制模块应…

【数据库系统概论】第2章:关系数据库

文章目录 0. 前言2.1 关系数据结构及形式化定义2.1.1关系2.1.2 关系模式 2.2 关系操作2.3 关系的完整性2.4 关系代数 0. 前言 关系数据库系统是支持关系模型的数据库系统。第一章初步介绍了关系模型及其基本术语。本章将深入介绍关系模型。 按照数据模型的三个要素,…

基础刷题50之五(重复的子字符串)

文章目录 前言一、题目二、力扣官方解释1、枚举2、字符串匹配 三、文心一言解释1、枚举2、字符串匹配 总结 前言 刚上研一,有人劝我好好学C,当时用的不多就没学,现在毕业上班了。在此亡羊补牢了 在此感谢力扣和文心一言 一、题目 给定一个…

Python图像处理【22】基于卷积神经网络的图像去雾

基于卷积神经网络的图像去雾 0. 前言1. 渐进特征融合网络2. 图像去雾2.1 网络构建2.2 模型测试 小结系列链接 0. 前言 单图像去雾 (dehazing) 是一个具有挑战性的图像恢复问题。为了解决这个问题,大多数算法都采用经典的大气散射模型,该模型是一种基于单…

ECharts饼图图例消失踩的坑

在使用Echarts的饼图时,当时做法是在图例数小于8时显示全部的图例,在大于8的时候显示前8个图例。于是用了两种不同的方式处理。导致出现切换时间后图例不显示的情况。 错误过程: 在进行图例生成时采用了两种不同的方式: ①如果…

Redis底层源码分析系列(前提准备)

文章目录 一、 面试题二、 源码分析1. 源码导入2. 源码核心部分 一、 面试题 1. redis跳跃列表了解吗?这个数据结构有什么缺点? 2. redis项目里面怎么用? redis的数据结构都了解哪些? 3. redis的zset底层实现? redi…

深入理解Servlet

目录: ServletWeb开发历史Servlet简介Servlet技术特点Servlet在应用程序中的位置Tomcat运行过程Servlet继承结构Servlet生命周期Servlet处理请求的原理Servlet的作用HttpServletRequest对象HttpServletResponse对象ServletContext对象ServletConfig对象Cookie对象与…

Constrained Iterative LQR 自动驾驶中使用的经典控制算法

Motion planning 运动规划在自动驾驶领域是一个比较有挑战的部分。它既要接受来自上层的行为理解和决策的输出,也要考虑一个包含道路结构和感知所检测到的所有障碍物状态的动态世界模型。最终生成一个满足安全性和可行性约束并且具有理想驾驶体验的轨迹。 通常,motion plann…

微信小程序开发系列(二十八)·小程序API如何发送网络请求以及网络请求失败后的解决方法

目录 1. 小程序API介绍 2. 网络请求 2.1 网络请求失败解决方法 2.2 如何跳过域名校验 1. 小程序API介绍 小程序开发框架提供丰富的微信原生API,可以方便的调起微信提供的能力,例如:获取用户信息、微信登录、微信支付等,小…

“antd“: Unknown word.cSpell

你遇到的问题是 VS Code 的 Code Spell Checker 插件在检查拼写时,将 "antd" 标记为未知单词。"antd" 是 Ant Design 的缩写,是一个流行的 React UI 库,不是一个英语单词,所以 Spell Checker 会将其标记为错误…

Microsoft SQL Server 编写汉字转拼音函数

目录 应用场景 举例 函数实现 小结 应用场景 在搜索应用中,我们一般会提供一个搜索框,输入关健字,点击查询按钮以获取结果数据。大部分情况我们会提供模糊查询的形式以在一个或多个字段进行搜索以获取结果。这样可以简化用户的操作&…

游戏资讯网站系统aspnet+sqlserver

aspnet游戏资讯网站系统本网站采用三层架构编写 有增删查改全部功能 使用了objectDataSource 新技术:采用bootstrap前端框架 dntb控件 随着游戏行业的快速发展,越来越多的玩家需要一个了解全面游戏资讯信息的平台。 充分做了可行性分析后,我…

从零学习Linux操作系统 第三十五部分 Ansible中的角色

一、理解roles在企业中的定位及写法 #ansible 角色简介# Ansible roles 是为了层次化,结构化的组织Playbookroles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们roles一般用于基于主机构建服务的场景中&…

如何将视频内容转换为文字文稿?这三款工具助您实现视频转写!

在日常生活中,有时我们需要将视频中的内容转换为文字文稿以便于搜索、编辑或分享。但选择合适的视频转文字软件可能让人感到困惑。今天我将为您推荐三款优秀的视频转文字工具,它们操作简单、准确高效,能够帮助您快速完成视频内容转写的工作。…

MySQL三种日志

一、undo log(回滚日志) 1.作用: (1)保证了事物的原子性 (2)通过read view和undo log实现mvcc多版本并发控制 2.在事务提交前,记录更新前的数据到undo log里,回滚的时候读…

企业智能化转型的关键步骤与陷阱

目录 前言1 转型的关键步骤1.1 深度学习AI技术课程的重要性1.2 激发创意,开展多样化项目的战略意义1.3 招募机器学习专业人才的加速转型1.4 引入具备领导力的AI领导1.5 建立与AI领导的紧密沟通机制 2 智能化转型的陷阱2.1 谨慎期待AI解决所有问题的智慧2.2 综合考虑…

Docker进阶:深入理解 Dockerfile

Docker进阶:深入理解 Dockerfile 一、Dockerfile 概述二、为什么要学习Dockerfile三、Dockerfile 编写规则四、Dockerfile 中常用的指令1、FROM2、LABEL3、RUN4、CMD5、ENTRYPOINT6、COPY7、ADD8、WORKDIR9、 ENV10、EXPOSE11、VOLUME12、USER13、注释14、ONBUILD 命…