游戏开发线性空间下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等组件设置的颜色才会准确;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介

1. 基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化! 动态 web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化&#xf…

在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档

软件下载地址: https://sourceforge.net/projects/pdfsam/files/ 需要注意事项,系统需要java环境,确认系统有java环境,根据软件版本需求安装对应的java运行环境。 下载pdfsam-4.3.4-linux.tar.gz安装包,解压,将runt…

windows下Redis的使用

Redis简介: Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。 Redis通常被称为数据结构服务器,因为值(value&#xff…

【Linux系统编程】:信号(4)——信号的处理

1.进程地址空间内核区 我们之前都是谈进程地址空间的用户区,接下来我们谈谈内核区。 进程地址空间中的内核区是操作系统内核在进程地址空间中所占据的特定区域。 一般情况下,一个操作系统只有一个内核区以及一个内核级页表。而进程可以有多个页表。不论…

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **打印结果** 完整代码 以下游戏规则: 那么我们要实现的功能,就是…

掌握软件工程基础:知识点全面解析【chap03、chap05、chap06、chap08、chap09】

chap03 UML UML定义了哪些视图?分别具有什么特点? 1.用例图(Use case diagram) 用例图展示各类外部执行者与系统所提供的用例之间的连接。一个用例是系统所提供的一个功能的描述,执行者是指使用这些用例的…

Linux嵌入式编程中与线程有关的知识(线程的概念、线程的创建、互斥锁、线程挂起、主线程、如何看查线程的ID等知识点)

目录 01-线程的概念(通过“进程和线程”的区别来理解)简单的理解详细的理解1. **定义与本质**2. **资源占用**3. **切换开销**4. **通信方式**5. **独立性**6. **调度**7. **使用场景**8. **在Linux中实现**对比总结 02-线程创建函数pthread_create()详解**函数原型****参数说明…

数据结构(Java)——链表

1.概念及结构 链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 2.分类 链表的结构非常多样,以下情况组合起来就有 8 种链表结构: (1)单向或者双向 (…

win版ffmpeg的安装和操作

一、ffmpeg软件安装: ffmpeg是一个通过命令行将视频转化为图片的软件。 在浏览器搜索ffmpeg在官网里找到软件并下载(不过官网很慢),建议用这个下载。 下载的文件是一个zip压缩包,将压缩包解压,有如下文件…

SpringBoot学习

一、SpringBoot介绍 (一)SpringBoot简介 Spring Boot 是由 Pivotal 团队提供的一个用于简化 Spring 应用初始搭建以及开发过程的框架。它基于 Spring 框架,旨在通过减少配置和简化开发流程来加速应用的开发和部署。Spring Boot 提供了嵌入式的 Tomcat、Jetty 或 Un…

FIR数字滤波器设计——窗函数设计法——滤波器的时域截断

与IIR数字滤波器的设计类似,设计FIR数字滤波器也需要事先给出理想滤波器频率响应 H ideal ( e j ω ) H_{\text{ideal}}(e^{j\omega}) Hideal​(ejω),用实际的频率响应 H ( e j ω ) H(e^{j\omega}) H(ejω)去逼近 H ideal ( e j ω ) H_{\text{ideal}}…

FreeType矢量字符库的介绍、交叉编译以及安装

FreeType矢量字符库的介绍 FreeType 是一个开源的跨平台字体引擎库,广泛用于 Linux 嵌入式系统中实现字符显示的功能。它提供了高效的 TrueType、OpenType 和其他字体格式的解析和渲染功能,在嵌入式开发中尤其适合用来绘制矢量字体和位图字体。 FreeTy…

vue css box-shadow transition实现类似游戏中的模糊圈游走的感觉

先看效果&#xff1a; 代码如下&#xff1a; <template><div style"height: 800px"></div><divclass"rainbow-position"ref"host"><divv-for"config in colorStyles"class"one-shadow":style&q…

欧拉计划启航篇(一)

目录 1.什么是欧拉计划 2.简单介绍 3.访问不上去怎么办 4.第一题的代码编写 5.代码的优化 1.什么是欧拉计划 欧拉计划是和我们的数学知识相关的一个网站&#xff0c;但是这个网站上面的相关的问题需要我们去使用编程的知识去进行解决&#xff0c;因此这个适合对于想要提升…

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次&#xff0c;点赞17次&#xff0c;收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明&#xff1a;简单的布局组件&#xff0c;可容纳其他组件&#xff0c;并依据alignment属性精确指定内部组件的对…

无人零售 4G 工业无线路由器赋能自助贩卖机高效运营

工业4G路由器为运营商赋予 “千里眼”&#xff0c;实现对贩卖机销售、库存、设备状态的远程精准监控&#xff0c;便于及时补货与维护&#xff1b;凭借强大的数据实时传输&#xff0c;助力深度洞察销售趋势、优化库存、挖掘商机&#xff1b;还能远程升级、保障交易安全、快速处理…

springboot 配置跨域访问

什么是 CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&#xff0c;用于控制不同源的资源之间的交互。 在Web应用程序中&#xff0c;CORS定义了一种机制&#xff0…

Ubuntu离线安装Docker容器

前言 使用安装的工具snap安装在沙箱中&#xff0c;并且该沙箱之外的权限有限。docker无法从其隔离的沙箱环境访问外部文件系统。 目录 前言准备环境卸载已安装的Docker环境快照安装的Dockerapt删除Docker 安装docker-compose下载执行文件将文件移到 /usr/local/bin赋予执行权限…

【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData

组件继承于IBufferElementData&#xff0c;可以让一个实体拥有多个相同的组件。 using Unity.Entities;public struct MyBuffComponentData : IBufferElementData {public int num; }using System.Collections; using System.Collections.Generic; using UnityEngine; using U…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …