渲染颜色透明度异常分析 Unity RenderTexture

news2024/12/23 9:01:19

解决 Unity Canvas 相机 RenderTarget 渲染颜色透明度异常的问题

问题

重现场景

  1. 新建一个 Canvas-RT , Canvas Render Mode 改为 Screen Space - Camera

0017f22d7245876d03de0af19fb8efad.png
  1. Canvas-RT 添加一个 RawImage-Origin 对象,修改颜色透明度为 120

9d8f4622933c1cddd3437acdb0d29001.png
  1. 修改 Camera-RT 中的 Target Texture , 改为 RT 纹理。

52048f5e723a705cc8f17bcadf9bbec8.png
  1. 再新建一个 Canvas ,并添加一个 RawImage-RT , Texture 使用 RT

8e4bf392cc29fdfd1d06c1cdf8f884cb.png
  1. Canvas 添加一个 RawImage-Compare 对象,修改颜色透明度为 120

2b0e86fe04ed11fc5bb81a6f44709416.png
  1. Game View 中对比,发现颜色不同。

df7e59b98a2ed74b3dabcec64a28304a.png

分析

UI-Default.shader

先在 https://unity.cn/releases 中下载内置 shader

8b7e31096aba8dbd52270d20eecf2355.png

找到 UI-Default.shader , 这里对需要的关键代码做出截取。

Blend One OneMinusSrcAlpha

fixed4 frag(v2f IN) : SV_Target
{
    half4 color = IN.color * (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd);
    color.rgb *= color.a;
    return color;
}
  • 混合因子为 One OneMinusSrcAlpha

  • 输出颜色结果为 (c.r*t.r*c.a*t.a, c.g*t.g*c.a*t.a, c.b*t.b*c.a*t.a, c.a*t.a)

渲染过程

  1. 原图 RawImage-Origin 的纹理 texture 为默认白色(1,1,1,1) ,颜色 color 的值为 (1,1,1,0.5)

  2. UI-Default.shader 中的 frag 输出为 (0.5,0.5,0.5,0.5)

  3. 相机 Camera-RTclearcolor(0,0,0,0)shader 的混合因子为 Blend One OneMinusSrcAlpha

  4. 第2步得到的颜色与第三步混合的结果为 (0.5,0.5,0.5,0.5) , 此结果为 RT 的纹理

  5. 展示图 RawImage-RT 中的纹理 texture 为第4步的中 RT 的纹理,颜色 color 的值为 (1,1,1,1)

  6. UI-Default.shader 中的 frag 输出为 (0.25,0.25,0.25,0.5)

  7. 相机 Main Cameraclearcolor(0,0,0,0)shader 的混合因子为 Blend One OneMinusSrcAlpha ,混合输出为  (0.25,0.25,0.25,0.5)

8be3dcee2c0d89d01a8d1d0914a73cfc.png

解决

预期为第二步的结果。究其原因,是在第6步的时候,RT 的纹理 RGB 已经乘上了透明度,在此步骤计算颜色值时,又再乘了纹理的透明度,导致最终输出颜色异常。

针对此方案,只需对 RawImage-RTshader 进行修改,去掉乘以纹理的透明度,关键代码改成如下所示

color.rgb *= IN.color.a;

特别要注意混合模式,若混合因子为 Blend SrcAlpha OneMinusSrcAlpha 时,与相机混合时,结果会多乘以Alpha

小结

当颜色显示出现异常时,可以从以下两个方式着手分析。

  • 混合模式

  • frag 颜色计算

希望对大家所帮助,欢迎关注白玉无冰。欢迎留言讨论。

868f89a490d519154830bf23197b158a.jpeg

点击“阅读原文”查看精选导航

“点赞“ ”在看” 鼓励一下ecc240488be3f0c063d26fdd59158e9e.png

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

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

相关文章

如何实现Nginx+Tomcat反向代理与负载均衡

目录 一、正向代理与反向代理 正向代理 反向代理 二、负载均衡 什么是负载均衡 代码仓库定义 分流策略 权重 least_conn(最少连接) ip_hash(负载均衡模式) fair(第三方负载均衡模式) url_hash&…

算法设计与分析 课程期末复习简记

目录 网络流 线性规划 回溯算法 分支限界 贪心算法 动态规划 分治算法 算法复杂度分析 相关概念 网络流 下面是本章需要掌握的知识 • 流量⽹络的相关概念 • 最⼤流的概念 • 最⼩割集合的概念 • Dinic有效算法的步骤 • 会⼿推⼀个流量⽹络的最⼤流 下面对此依次进行复…

基于AUTOSAR的ECU启动阶段哪些事儿

AUTOSAR实战篇:EcuM启动时序大总结 前言 小T出品,必是精品! EcuM启动时序大总结,你值得拥有! 正文 正如小T前文中《AUTOSAR基础篇之EcuM》中讲到的那样,AUTOSAR架构中将ECU的上下电过程统一由单一的模块来进行统一管理,即EcuM模块。 虽然不同硬件的初始化过程不一样,但…

Redis是什么

Redis是什么 https://blog.csdn.net/Little_Oranges/article/details/121870705 1.简介 基于字典格式的。基于内存,高性能的。键值对的方式进行存储。可以存储多种数据结构类型的数据。 2.应用场景 缓存排行榜计数器分布式会话分布式锁社交网络最新列表消息系统 …

华为OD机试真题 JavaScript 实现【查找充电设备组合】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、JavaScript算法源码六、效果展示1、输入2、输出3、说明一、题目描述 某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的…

Qt Quick系列(8)—Model-View—视图信号

🚀作者:CAccept 🎂专栏:Qt Quick 文章目录 前言代码示例源码关键知识点 总结 前言 在Qt Quick的Model-View中内置视图有很多,有Repeater、ListView、GridView…,而他们也有着自己的信号,比如…

WebDAV之派盘本地个人云+Documents

Documents是一款由Readdle开发的文档管理和编辑工具,支持PDF阅读、音频播放、图像浏览和标注、以及多种常见文档格式的编辑操作等。派盘是一款本地私有云产品,基于WebDAV、FTP、SMB等多种协议,提供文件存储、分享、同步、备份等服务&#xff…

【Squid一】Squid代理服务器应用

Squid代理服务器应用 1.Squid代理服务器1.1 正向代理的工作机制1.2 代理服务器的概念及其作用1.3 代理服务器主要作用1.4 Squid代理的类型 2.CDN2.1 CDN概述2.2 CDN优势2.3 CDN对网络的优化作用2.4 CDN访问过程2.5 CDN网络的组成要素 3.安装Squid服务3.1 使用脚本启动和关闭squ…

guest内核不响应导致磁盘卸载问题排查

用户问题 客户报障磁盘卸载不了,而且是经常出现卸载不了的情况,客户比较着急,同时PDD也是大客户。 排查过程 查看宿主机上虚拟机信息 1、用户虚拟机有14块磁盘,而且这14块都是以legacypci的方式插入虚拟机,我印象中…

MATLAB | 拉普拉斯分布/拉普拉斯噪声的生成

一、实验目标 生成拉普拉斯分布的噪声,并分析它的概率密度函数 二、解决思路 (1)拉普拉斯分布可以由指数分布生成 拉普拉斯的概率密度函数为 f ( x ; μ , λ ) 1 2 λ e − ∣ x − μ ∣ λ f(x;\mu,\lambda)\frac{1}{2 \lambda} e^{…

创建启动前端vue与后端python/flask,前后端分离,相互传递参数

创建启动vue 确保你已经安装了Node.js和npm 安装vue npm install -g vue/cli创建vue项目: vue create my-project cd my-project启动vue npm run serve如果安装vue报错:管理员权限模式打开powershell Windows PowerShell 版权所有(C&#…

windows怎么查看目标文件.o and windows - 如何使用/安装 GNU binutils (objdump)

GNU binutils-objdump工具 一、windows怎么查看目标文件.o二、安装GNU binutils (objdump)三、使用GNU binutils (objdump)参考资料 一、windows怎么查看目标文件.o 可以使用GNU binutils (objdump)进行查看编译生成的目标文件.o。 二、安装GNU binutils (objdump) 点击下载…

Apache Airflow 多个 Provider 存在漏洞

项目介绍 Airflow 是一个使用 python 语言编写的 data pipeline 调度和监控工作流的平台。 Airflow 是通过 DAG(Directed acyclic graph 有向无环图)来管理任务流程的任务调度工具, 不需要知道业务数据的具体内容,设置任务的依赖…

辅助驾驶功能开发-功能规范篇(21)-4-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 • 超级自动泊车辅助(Super AutoParking Assist)、语音控制泊车辅助(Autoparking with Speech) - 产品定义 超级自动泊车辅助是⼀个增强的自动泊车辅助系统。在超级自动泊车辅助系统中,识别车位将会变得实时可见, 并且不可泊入的⻋位也将…

zynq系列器件使用vivado配置国产内存

zynq系列器件使用vivado配置国产内存 一、镁光公司器件命名的含义二、紫光公司器件命名的含义二、国产ddr(SCB13H8G162BF-13KI)和镁光(MT41K512M8-125)ddr参数对比三、vivado参数填入 一、镁光公司器件命名的含义 以MT41K512M8-1…

代码随想录算法训练营第六天 | 哈希表系列2(两数之和--四数相加II--三数之和--四数之和)

哈希表系列2 1 两数之和本题思路代码随想录的代码力扣的示例代码 454 四数相加II本题思路代码随想录的代码力扣的示例代码 15 三数之和本题思路代码随想录的代码力扣的示例代码 18 四数之和代码随想录的代码力扣的示例代码 1 两数之和 给定一个整数数组 nums 和一个整数目标值…

DAY41——动态规划part3

整数拆分 dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。 dp[i](i-j)*j或j * dp[i-j]两种可能,前者是拆成两个数的可能性,后者是拆成三个或更多的可能性 对于dp[i] j * dp[i-j] 对每个i遍历j(1->i-1) 事实上是把i拆成j和i-j两…

web安全php基础_搭建php环境

首先打开phpstudy的网站栏点击创建网站,新建一个网站(域名随便输反正是局域网)然后点击确认 如下,网站便创建好了 打开浏览器输入刚刚创建网站时输入的域名,即可看见我们的网站 然后网站好了,就可以新建项…

IDEA中MyBatiX插件的使用教程

MybatisX插件功能介绍 主要功能如下: 生成mapper xml文件 快速从代码跳转到mapper及从mapper返回代码 mybatis自动补全及语法错误提示 集成mybatis generator gui界面 根据数据库注解,生成swagger model注解 首先下载MybatisX插件 配置数据源 在idea中连…

【C语言】指针和数组笔试题解析

简单不先于复杂,而是在复杂之后。 注:题目会附在前面,大家可以先复制代码自己做一遍,再看答案。 目录 1. 一维数组 2. 字符数组 2.1 sizeof 相关 2.1.1 题一 2.1.2 题二 2.1.3 题三 2.2 strlen 相关 2.2.1 题一 2.2.…