(这里说的图都是指单通道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也可以啊,只要看不出来或者不影响效果就可以了,这些只要遵守图形大法---看起来是对的,那就是对的,就可以了
至此就结束了,再次上一下效果图吧