当前位置: 首页 > news >正文

游戏开发线性空间下PS工作流程

前言

使用基于物理的渲染,为了保证光照计算的准确,需要使用线性空间;

使用线性空间会带来一个问题,ui 在游戏引擎中的渲染结果与 PS 中的不一致:

PS(颜色空间默认是sRGB伽马空间):

        

        (三个图层的分别对应RGB三种颜色,颜色值都为128,三个图层不透明度都为70%)

        导出3张png图片,导出时勾选sRGB,图片位于伽马空间;

游戏引擎(unity线性空间为例):

        导入3张png图片,勾选sRGB(采样纹理时自动将颜色值转化到线性空间);

        

        很明显,效果不一致;

为何不一致?来看颜色混合过程:

PS:

        

        (蓝色通道 b = 255 * ( (1 - 70%) + 0.5 * 70%) = 166)

Unity(为了演示精确结果,开启了HDR):

        

        蓝色通道 b = 255 *((1 ^ 2.2) * (1 - 70%) + (0.5 ^ 2.2) * 70%)^  0.4545
                           = 178

                (^2.2表示将伽马值转换到线性空间,^0.4545将最终的线性值转换到伽马空间)

             (之所以最终将线性值转换到伽马空间,因为显示器的输入需要在伽马空间下)

因此,游戏引擎使用线性空间时,渲染结果与伽马空间中的PS效果不一致;

解决方案:

1. 游戏引擎渲染ui时转化到伽马空间;

        在使用线性空间渲染完场景后,将颜色缓冲区的值转化到伽马空间,这样渲染ui时,颜色值就位于伽马空间,混合时计算方式与ps那边相同;在渲染完ui后,再转化到线性空间。如果使用untiy urp渲染管线,通过自定义渲染pass可以容易做到;

        此时ui贴图不要勾选sRGB,因为需要的是伽马空间的值,不需要转化为线性;

        该种方式的缺陷是客户端有两套颜色空间,增加了制作复杂度;

        笔者经历过使用这种方式的项目,觉得这种方式很不方便,尤其是在制作特效时;场景的特效需要在线性空间下制作,ui的特效则需要在伽马空间下制作;贴图如果是在场景里使用,则需要勾选sRGB,如果是在ui上使用,则不需要勾选sRGB;

2. PS使用线性空间:

在介绍PS使用线性空间前,先介绍网络上另一种工作流:PS使用伽马空间,通过设置用灰度系数1混合RGB来达到线性空间混合的结果;

用灰度系数1混合RGB:

        (通过设置以灰度系数1混合,使PS中的结果与游戏引擎一致)

        这种方式有局限性,如果PS使用了图层样式:

        

               (纯黑色,填充50%,然后加上描边效果)

        

                (PS中的结果)

           

                (栅格化图层样式,或者导出png图片的结果)

        可看到PS在以灰度系数1混合时,不能正确处理填充,所见与所得不一致;

        合并带填充的图层时,合并前后的效果不一样:

        

                (合并前)

                

                (执行合并图层)

        因此,以灰度系数1混合不是理想解决方案;

PS使用线性空间:

当PS使用线程空间时,就不会存在上述用灰度系数1混合RGB的问题;

PS设置线性空间:

设置好后,存储一下配置:

将原先伽马空间下的文档转化到线性空间:

        设置->转换为配置文件

        

        

于是PS中的效果变为:

        

        (与游戏引擎渲染一致,因为都在线性空间下)

虽然PS设置在线性空间,但美术从其他网站下载的图片素材基本都是位于伽马空间,并且为了高效保存数据,美术输出的图片也要勾选sRGB,保存在伽马空间中;

PS线性空间下导入伽马空间的图片时,PS不会自动帮我们进行伽马校正(Unity可以设置贴图sRGB,采样时自动伽马校正):

        

我们可以手动进行伽马校正:

        选中导入图片所在的图层,执行:

                

                

我们可以写ps脚本,在导入伽马空间的图片时自动进行伽马校正:

        

        (自动化脚本目前不提供,可参考ps脚本化编程文档)

PS在线性空间下,渐变出现条纹的问题:

        

将渐变图片放到游戏引擎里面,发现效果比PS中好,PS在线性空间下计算好像精度丢失严重;

可将图像转化为16位通道,这样在线性空间下计算精度更高:

        

        

最后,如果使用unity引擎,记得Canvas勾选:

        

        这样TextMeshPro等组件设置的颜色才会准确;

相关文章:

游戏开发线性空间下PS工作流程

前言 使用基于物理的渲染,为了保证光照计算的准确,需要使用线性空间; 使用线性空间会带来一个问题,ui 在游戏引擎中的渲染结果与 PS 中的不一致: PS(颜色空间默认是sRGB伽马空间)&#xff1a…...

7-10 最长公共子序列

目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 详细代码: 题目描述 给出 1~n 的两个排列 P1 和 P2,求它们的最长公共子序列。 n 在 5~1000 之间。 输入格式: 第一行是一个数 n 接下来两行,每行为 n 个数&…...

亚远景-ISO 21434标准下的汽车网络安全:风险评估与管理的关键实践

ISO 21434标准,全称为ISO/SAE 21434 "Road Vehicles - Cybersecurity Engineering",是国际标准化组织(ISO)发布的针对汽车领域的标准,旨在指导汽车制造商、供应商和相关利益相关方在汽车系统中应用适当的网络安全措施。在ISO 21434…...

C++ 的 source_location

1 __FILE__ 和 __LINE__ ​ 你一定看过这样的代码: printf("Internal error at \"%s\" on line %d.\n", __FILE__, __LINE__); 这行代码的作用就是打印出 printf() 函数调用发生时所在的源代码文件名(包含路径)和这行代…...

[python SQLAlchemy数据库操作入门]-14.实时数据采集 记录股市动态

哈喽,大家好,我是木头左! 要使用 SQLAlchemy 进行实时数据采集,首先需要搭建相应的开发环境。以下是所需的主要步骤: 安装 Python:确保你的系统上已经安装了 Python,推荐使用 Python 3.x 版本。创建虚拟环境:为了隔离项目依赖,建议为每个项目创建一个虚拟环境。可以使…...

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串?2、两个引号之间加上空格 好的,我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别,以及它们在 SQL 查询中的作用: 1. we_chat_union_id IS NOT NULL 含…...

【和春笋一起学C++】文本输入与读取

前言:前面学习了while语句后,下面用while语句实现一个重要的功能,逐字符的读取键盘输入的字符序列,并输出到显示屏上。 准备知识: C的输入输出包含以下3方面的内容: 对系统指定的标准设备的输入和输出。即…...

D类音频应用EMI管理

1、前言 对于EMI,首先需要理解天线。频率和波长之间的关系,如下图所示。   作为有效天线所需的最短长度是λ/4。在空气中,介电常数是1,但是在FR4或玻璃环氧PCB的情况下,介电常数大约4.8。这种效应会导致信号在FR4材…...

第N8周:使用Word2vec实现文本分类

文章目录 一、数据预处理1.加载数据2.构建词典3.生成数据批次和迭代器 二、模型构建1.搭建模型2.初始化模型3.定义训练与评估函数 三、训练模型1.拆分数据集并运行模型 四、总结 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者&a…...

100天精通Python(爬虫篇)——第113天:爬虫基础模块之urllib详细教程大全

文章目录 1. urllib概述2. urllib.request模块 1. urllib.request.urlopen()2. urllib.request.urlretrieve()3. urllib.request.Request()4. urllib.request.install_opener()5. urllib.request.build_opener()6. urllib.request.AbstractBasicAuthHandler7. urllib.request.…...

光谱相机与普通相机的区别

一、成像目的 普通相机:主要目的是记录物体的外观形态,生成人眼可见的、直观的二维图像,重点在于还原物体的形状、颜色和纹理等视觉特征,以供人们进行观赏、记录场景或人物等用途。例如,拍摄旅游风景照片、人物肖像等…...

Mysql数据 新增、修改和删除操作时,这些变化如何被转换为Kafka消息?

Mysql数据 新增、修改和删除操作时,这些变化如何被转换为Kafka消息? 为了在FlinkCDC中配置MySQL同步到Kafka,并采用debezium-json数据格式,我们需要了解当执行新增、修改和删除操作时,这些变化如何被转换为Kafka消息。下面我们将详细介绍这些变化情况,并提供具体的数据样…...

《Python 机器视觉:开启智能视觉新时代》

《Python 机器视觉:开启智能视觉新时代》 一、Python 机器视觉的基石(一)关键库的强大力量(二)环境搭建的便捷路径 二、核心功能与奇妙应用(一)图像的奇幻处理(二)目标检…...

uniapp实现为微信小程序扫一扫的功能

引言 随着微信小程序的快速发展,越来越多的开发者开始关注和学习微信小程序的开发。其中,微信小程序的扫一扫功能是非常常用且实用的功能之一。通过扫描二维码,用户可以获取到相关的信息或者实现特定的功能。 正文 在过去,开发者需要使用微信开发者工具以及相关的开发文档…...

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…...

使用FFmpeg进行拉流和推流操作

FFmpeg是一款强大的多媒体处理工具,可以用于视频的录制、转换、推流和拉流等操作。下面将详细介绍如何使用FFmpeg进行拉流和推流操作。 1. FFmpeg推流操作 推流是将本地的音视频流推送到流媒体服务器上,例如主播将本地电脑上的画面推流到直播平台的流媒…...

Unity微信小游戏接入开放数据域

demo地址:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/tree/main/Demo/Ranking 官方说明: https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/OpenData.md 准备一个Canvas&#xff0c…...

Spring Boot的开发工具(DevTools)模块中的热更新特性导致的问题

问题: java.lang.ClassCastException: class cn.best.scholarflow.framework.system.domain.entity.SysUser cannot be cast to class cn.best.scholarflow.framework.system.domain.entity.SysUser (cn.best.scholarflow.framework.system.domain.…...

Elasticsearch安装和数据迁移

Elasticsearch安装和数据迁移 Elasticsearch安装 下载并解压Elasticsearch 首先下载Elasticsearch的tar.gz文件,并将其解压: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.2-linux-x86_64.tar.gz tar -xzf elastics…...

Numpy指南:解锁Python多维数组与矩阵运算(下)

文章一览 前言一、排序1.1 numpy.sort1.2 numpy.argsort1.3 numpy.lexsort 二、数组操作2.1 数组元素迭代2.2 数值舍入计算2.3数值取整2.4 数组去重2.5 数组拼接2.6 数组行列交换 三、文件读写3.1 np.fromfile() 读文件3.2 np.loadtxt() 读文件3.3 用 csv 模块逐行处理 CSV 格式…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...