2MapsIn1Channel----什么?!两张灰度图存在一个通道里?!

2024-08-20 15:58

本文主要是介绍2MapsIn1Channel----什么?!两张灰度图存在一个通道里?!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(这里说的图都是指单通道8bits图)

要把两张图存在一个通道里?要把4张图存在一个通道里?!要不8张图存在一个通道里??!!

这是不是要疯!!!!

的确是可以的!!!下面。。。。下发个广告。乳此厚颜无耻的我,你又能奈我何!!!

坐标山东青岛市北,招聘日系画师,其他岗位目前公司没有说,有意思的可以入群私聊。

然后再说一下QQ群,山东手游研发聚集地335772557,进群先看公告,要是抱着我要学习的心态进群的话,那你就失望了,因为是个死群。

偶尔心情好的是时候会发个技术链接。

接下来进入正题!!

看到标题大家也知道,请不要问我有没有损失!!!,要是没有损失,那些搞编码的不早就修改图片的存储了!!!损失必然是有的,我也没有考虑过这种技术要用在哪里,权当纯技术分享吧,技术来源于网络,我只是个消化过一遍的人,在这里吐一遍国产的技术记录文档。

先上一下结果图,看质量也知道左边是技术之后的结果。



一个通道有8bits,XXXXXXXX,如果前四个通道我们来存储一张灰度图,后四个存储另外一张灰度图,XXXXYYYY,这样就完成了两个map的存储。(一个通道存4张或者8张的理论也是这个)。我再来看一下代价,很明显的,图片的颜色值损失了,这样sample图片之后必然会出现色阶的明显过度;也很明显的,一个通道存了两张灰度图,如果您的游戏风格就是色阶过度明显的这种呢。

首先,说一下如何把一个灰度图转到8bits的前4bits(XXXX(0-15))里。

这个灰度值我们叫A,A属于0-255范围的一个值。

因为4bits所能代表的最大也就是15,也就是说要把A这个0-255范围的值浓缩到0-15里,这一步图像也就产生了损失。这种范围值的变换对于程序来说都是小菜。我也不想考虑程序如何去做这一块,这一步属于美术出图部分,所以就用美术的工具去做,对于想采用这种技术去做大量图片的项目来说,让项目的程序自己写个批处理的工具吧,对他们来说很简单的。接下来,PS部分:


给图层1加一个色阶,把输出色阶的范围修改到0-15(XXXX)就可以了。左边的图像看起来是黑色的,请不要质疑,他是有信息的,只是颜色很淡很淡,看不太出来而已。

到了这一步,或许大家以为这张图就可以了。但是请不要忘记,XXXXYYYY中的XXXX是前4bits,也就是说这张图是要存到XXXX0000,这又是一部范围的转换把0-15范围转到0-240(0000-1111转到00000000-11110000),继续看ps:


在加一个色阶,修改如上图,到这一步,这张图已经存储到8bits的前4位里了。

第二张图的操作就是存到后4bits里,所以也就是第一张图的第一步:

这样张两张图就做好了,然后把第一张图和第二张图打个组,方便后面的叠加模式。


选中上面那个组,把叠加模式选择为线性减淡(相加)--(linear dodge(add))


这样就已经成功的把两张灰度图存到了一个通道里了。到这一步美术的准备工作就已经结束了,可以喝个咖啡。休息一下了。


。。。。。。过了好久好久。。。。。


接下来,我们进入Unity引擎来操作(其他引擎也一样,因为我熟悉unity引擎,就选择了Unity)

繁琐的shader创建和材质指定这种小白过程我就直接省略吧。直接进入fragment阶段。

首先我要把出来的图给拿到是吧

fixed col = tex2D(_MainTex,i.uv).r;//单通道

总所周知,在shader中col的范围是0-1。。。。

然而,我们需要的是0-255

于是,就有了

half col255 = col*255;//convert 0-1 to 0-255

先举个栗子。。。

假如颜色值为236,那么这个值的二进制就是11101100

如何拆分这个二进制呢。

236/16.0=14.75(为啥除以16呢。。。0000-1111,共16个数,我这种不负责任的解释是不是很傻逼。。)

然后我们看一下14的二进制是1110,巧合么?肯定不是啊。。。巧合的话,还说个P。。。

接下来进入shader操作

half XXXX = col255/16.0;//取前四位----XXXXYYYY->XXXX

但是这一步还没有取到前四位,目前XXXX还是有小数位的,干掉他!

XXXX = floor(XXXX);//丢掉小数位

然后要把XXXX还原到XXXX0000

XXXX*=16;

至此,我们已经取到的存储在前4bits里的图中的像素值,范围是0-240(00000000-11110000)

接下来就是去拿后4bits的值了

half YYYY = col255 - XXXX;//这个值的范围就是0-15了(0000-1111)

既然已经把ps做的操作都反向取值结束了,那么就剩最后一步了,把算好的值的范围归位。

half co1 = XXXX/240.0;

half col2 = YYYY/15.0;//为啥除以15,因为YYYY的最大值就是15,也就是最大就是纯白哟,除以16也可以啊,只要看不出来或者不影响效果就可以了,这些只要遵守图形大法---看起来是对的,那就是对的,就可以了

至此就结束了,再次上一下效果图吧



这篇关于2MapsIn1Channel----什么?!两张灰度图存在一个通道里?!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090518

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Matplotlib图像读取和输出及jpg、png格式对比,及透明通道alpha设置

图像像素值 图像像素值一般size为3,也就是通道数,分别代表R,G,B,如果只有单一 一个值则表示灰度值,也就是说一张二维图片,当长和宽都为1080时,那么若是灰度图像,图像尺寸为(1080,1080,1)若是RGB图像则为(1080,1080,3), jpg、png图像格式 jpg图像的灰度值范围和RGB范围为[0,255],数值类型为uint8,也就是无符号整数 png图像的灰度值范

LeetCode题练习与总结:存在重复元素Ⅱ--219

一、题目描述 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [1,2,3,1], k = 3输出:true 示例 2: 输入:nums = [1,0,1,1], k

flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)

前文 Flutter 是一个跨平台的开发框架,它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。 上文flutter开发多端平台应用的探索 上(基本操作)-CSDN博客列举了一些特定平台的case(桌面端菜单,鼠标快捷键)的使用方法,有些是flutter提供了对应能力,只需要学习如何调API,有些事三方库支持,本文要探讨的平台通道是更为强大的工具,很多三方插件

【go 通道】go语言通道channel

通过使用通道,在多个goroutine发送和接受共享的数据,达到数据同步的目的。 通道,他有点像在两个routine之间架设的管道,一个goroutine可以往这个管道里塞数据,另外一个可以从这个管道里取数据,有点类似于我们说的队列。 声明一个通道很简单,我们使用chan关键字即可,除此之外,还要指定通道中发送和接收数据的类型,这样我们才能知道,要发送什么类型的数据给通道,也知道从这个通道里可

k8s灰度/金丝雀发布

灰度及蓝绿发布是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。         灰度发布的方式通常用于AB测试,是指一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。

docker安装 redis 并且加密开启SSL/TLS通道

拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latestdocker tag registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest redis:latest 要在 Docker 容器中启动 Redis 并开启 SSL/TLS 加密