Java 为什么我要在libGDX中的纹理上获得黑色轮廓/边缘?
每当我画一个边缘有alpha的纹理(photoshop对其进行了抗锯齿处理),这些边缘就会变暗。我一直在使用纹理过滤器和混合模式,但都没有成功 我的意思是:Java 为什么我要在libGDX中的纹理上获得黑色轮廓/边缘?,java,android,opengl-es,libgdx,photoshop,Java,Android,Opengl Es,Libgdx,Photoshop,每当我画一个边缘有alpha的纹理(photoshop对其进行了抗锯齿处理),这些边缘就会变暗。我一直在使用纹理过滤器和混合模式,但都没有成功 我的意思是: minFilter:Linear磁过滤器:Linear minFilter:mipmaplinearest magFilter:Linear minFilter:MipMapLinearLinear-magFilter:Linear 如您所见,更改libGDX纹理打包器上的过滤器会对外观产生很大影响,但alpha仍然是暗的 我尝
minFilter:Linear磁过滤器:Linear
minFilter:mipmaplinearest magFilter:Linear
minFilter:MipMapLinearLinear-magFilter:Linear
如您所见,更改libGDX纹理打包器上的过滤器会对外观产生很大影响,但alpha仍然是暗的
我尝试在libgdx中手动设置纹理过滤器,方法是:
texture.setFilter(minFilter, magFilter);
但这是行不通的
我读过,使用线性过滤器缩小尺寸会导致alpha像素默认为黑色?如果是这样的话,我怎样才能避免呢
我也尝试过改变混合模式:glBlend(GL\u SRC\u ALPHA,GL\u ONE\u减去\u SRC\u APHA)
没有任何区别<代码>glBlend(GL_ONE,GL_ONE _减去SRC_ALPHA)完全删除ALPHA,因此不起作用
我确实不想将我的minFilter
设置为Nearest
,因为这会使事情看起来非常像素化。我尝试过纹理过滤器的每一种组合,但每种组合都会产生相同的黑色/暗边/轮廓效果
我读过,使用线性过滤器缩小尺寸会导致alpha像素默认为黑色
这不一定是真的;这取决于Photoshop决定在完全透明的像素中加入什么颜色。很明显你的情况是黑色的
出现问题的原因是GPU在两个相邻像素之间插值,其中一个像素是完全透明的(所有颜色通道也设置为零)。假设另一个像素为鲜红色:
(255, 0, 0, 255) // Bright red, fully opaque
( 0, 0, 0, 0) // Black, fully transparent
使用50/50比率进行插值可得出:
(128, 0, 0, 128)
这是一个半不透明的深红色像素,可以解释你看到的暗条纹
有两种可能的解决办法
1.将出血添加到透明区域
确保完全透明的像素具有指定给它们的正确颜色;从本质上讲,将颜色从最近的不透明像素“渗出”到相邻的完全透明像素。我不确定Photoshop能不能做到这一点,但libGDX TexturePacker能做到;看。您需要小心地将bleedIterations
设置得足够高,并添加足够的填充物,以使出血扩展到特定的降尺度级别
现在的例子是这样的:
(255, 0, 0, 255)
(255, 0, 0, 0) // Red bled into the transparent region
现在,插值会根据需要提供一个明亮的红色透明像素:
(255, 0, 0, 128)
2.使用预乘阿尔法
这样做不太挑剔,但它有助于准确地知道你在做什么。同样,TexturePacker已经介绍了premultipledalpha
设置。这是OpenGL混合模式glBlend(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)
示例中的数字不变;这仍然是输出的像素:
(128, 0, 0, 128)
然而,这不再被解释为“半透明的深红色”,而是“添加一些红色,删除一些背景”。更一般地说,对于预乘alpha,颜色通道不是“混合哪种颜色”,而是“添加多少颜色”
请注意,像(255,0,0,0)
这样的像素不能再存在于源纹理中:因为alpha是预乘的,所以alpha为零自动意味着所有颜色通道也必须为零。(如果你想变得非常有趣,你甚至可以使用这些像素在相同的渲染过程和相同的纹理中应用加法混合,就像常规混合一样!)
关于预乘alpha的进一步阅读: