Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我要在libGDX中的纹理上获得黑色轮廓/边缘?_Java_Android_Opengl Es_Libgdx_Photoshop - Fatal编程技术网

Java 为什么我要在libGDX中的纹理上获得黑色轮廓/边缘?

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仍然是暗的 我尝

每当我画一个边缘有alpha的纹理(photoshop对其进行了抗锯齿处理),这些边缘就会变暗。我一直在使用纹理过滤器和混合模式,但都没有成功

我的意思是:

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的进一步阅读:


如果您使用的是使用Texture packer创建的TextureAtlas,则可以尝试增加精灵上的填充。若我没记错的话,线性滤波器检查最近的8帧以找到最好的像素,它可能会导致它是黑色边缘。我确实有这个问题,但我不记得我是如何解决的。我要么用PS重新制作精灵,要么改变了TexturePacker选项。我总是将TexturePacker内部的过滤器设置为线性。很抱歉,无法发布更明确的答案,我已经有一段时间没有使用LibGDXThank了!事实证明,所有问题都是由TexturePacker GUI造成的。在遵循您的第一个建议时,我转而使用命令行TexturePacker,这可能更为最新。