Creator半透明截图问题

  1. 问题表现:使用摄像机进行截图时,得到的截图每个像素的newOpacity/255=(oldOpacity/255)^3,oldOpacity是原图像素透明度,newOpacity是截图得到的新像素透明度。
  2. Creator版本:已测试1.9(使用cc.RenderTexture截图),2.0.2(使用cc.Camera截图)。论坛中还有看到Creator1.5测试发布贴以及某个cocos2d-x的帖子中反馈这个问题的,因此该问题可能存在了很久。
  3. 测试Demo(基于Creator 2.0.2):
    TranslucentScreenshot.zip (490.6 KB)
2赞

用2.0.2新的截图方法,游戏界面跑到左下角,只有四分之一,然后截图出来是上下颠倒的。测试机是安卓系统的坚果手机

1赞

你把摄像机节点调整好位置,然后把截图前把节点或者截图后把图再上下颠倒一次就行了。

1赞

@crazypad @Knox 麻烦看一下是我使用方式不对,还是截图功能有问题。谢谢~

我也遇到了这个问题,请问后来是怎么解决的呢?

同样也遇到了这个问题

有什么办法解决这个问题吗,半透明截图颜色变浅

截图后获取图片像素数据data,然后对半透明的点进行修复。不是很完美,作为参考吧:

2赞

这个问题官方还是没有什么回复吗:disappointed_relieved:

读取像素的时候,传递的是 gl.RGBA,透明通道应该是可以读取到的。
gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);

如下是设置节点透明度为 255 的时候,一段像素值,可以看到 alpha 是 255。

image

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

image

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

image

对于半透明图片的截屏,有通过设置为 ONE,或者反预乘的方式得到近似的结果。

https://stackoverflow.com/questions/24346585/opengl-render-to-texture-with-partial-transparancy-translucency-and-then-rende

背后的原因是跟线性空间跟非线性空间有关。非线性空间可以更好的符合人眼对明度的敏感度,匹配以前的荧光屏显示器,得到更高的显示精度。

  • 当美术制作的图为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);

3赞

老哥,很给力,你解决了我的问题,但是如果for循环里面,走了那个math的公式,如果两个透明叠起来,还是会透明的,所以我就强制都是255了。对于图层混合模式,我试过,颜色有偏差,做不到。所以用了你这种办法,很稳!

这个应该是Math.pow(data[w]/255,1/3)这个吧