- 问题表现:使用摄像机进行截图时,得到的截图每个像素的newOpacity/255=(oldOpacity/255)^3,oldOpacity是原图像素透明度,newOpacity是截图得到的新像素透明度。
- Creator版本:已测试1.9(使用cc.RenderTexture截图),2.0.2(使用cc.Camera截图)。论坛中还有看到Creator1.5测试发布贴以及某个cocos2d-x的帖子中反馈这个问题的,因此该问题可能存在了很久。
- 测试Demo(基于Creator 2.0.2):
TranslucentScreenshot.zip (490.6 KB)
用2.0.2新的截图方法,游戏界面跑到左下角,只有四分之一,然后截图出来是上下颠倒的。测试机是安卓系统的坚果手机
你把摄像机节点调整好位置,然后把截图前把节点或者截图后把图再上下颠倒一次就行了。
我也遇到了这个问题,请问后来是怎么解决的呢?
同样也遇到了这个问题
有什么办法解决这个问题吗,半透明截图颜色变浅
这个问题官方还是没有什么回复吗
读取像素的时候,传递的是 gl.RGBA,透明通道应该是可以读取到的。
gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);
如下是设置节点透明度为 255 的时候,一段像素值,可以看到 alpha 是 255。

当设置节点透明度为 128 的时候,相同位置的一段像素值,alpha 值以及 rgb 值都不是正确的值了,rgba 值都是原值的 0.75,也不是正确的预乘之后的结果。

该 Texture 设置给目标 Sprite 的时候,Sprite 的 SRC_BLEND 设置为 ONE,得到的结果接近原来的效果。

对于半透明图片的截屏,有通过设置为 ONE,或者反预乘的方式得到近似的结果。
背后的原因是跟线性空间跟非线性空间有关。非线性空间可以更好的符合人眼对明度的敏感度,匹配以前的荧光屏显示器,得到更高的显示精度。
- 当美术制作的图为8位时(256种颜色),颜色为经过Gamma骄正。 32位图时为真实颜色,表现为灰度值8位时为0.5. 32位时为0.2,也就是说用8位图制作时为非线性空间。 32位时为线性空间.
- 因为显示器最终都会进行一次display gamma校正(将8位颜色值域转换成32位线性值),所以我们需要在GPU进行一次encoding gamma 校正(所有的颜色计算都转换到线性空间下进行计算)。这样输出的最终颜色值才最接近真实的颜色。
在 shader 里面也可以通过对 rgb 进行校正处理
fragColor.rgb = pow(fragColor.rgb, 1.0/2.2);
老哥,很给力,你解决了我的问题,但是如果for循环里面,走了那个math的公式,如果两个透明叠起来,还是会透明的,所以我就强制都是255了。对于图层混合模式,我试过,颜色有偏差,做不到。所以用了你这种办法,很稳!
这个应该是Math.pow(data[w]/255,1/3)这个吧

