gpt4 book ai didi

java - 为什么我在 libGDX 中的纹理上出现黑色轮廓/边缘?

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:05 25 4
gpt4 key购买 nike

每当我绘制边缘周围有 alpha 的纹理(它被 photoshop 抗锯齿)时,这些边缘就会变暗。我无休止地使用纹理过滤器和混合模式,但没有成功。

我的意思是:

minFilter:线性 magFilter:线性

Circle on yellow background Red background

minFilter:MipMapLinearNearest magFilter:线性

enter image description here enter image description here

minFilter:MipMapLinearLinear magFilter:线性

enter image description here enter image description here

如您所见,更改 libGDX Texture Packer 上的过滤器会使外观发生很大变化,但 alpha 仍然很暗

我尝试在 libgdx 中手动设置纹理过滤器:

texture.setFilter(minFilter, magFilter);

但这不起作用。

我读到过使用线性过滤器缩小尺寸会导致 alpha 像素默认为黑色?如果是这种情况,我该如何避免呢?

我也尝试过更改混合模式:glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_APHA) 没有任何区别。 glBlend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) 完全删除了 alpha,因此它不起作用。

想将我的minFilter 设置为Nearest,因为它让事情看起来非常像素化。我已经尝试了所有其他的纹理过滤器组合,但所有结果都产生了相同的黑色/深色边缘/轮廓效果。

最佳答案

I have read that downscaling with a linear filter causes the alpha pixels to default to black?

这不一定是真的;这取决于 Photoshop 决定放入完全透明像素的颜色。显然你的情况是黑色的。

出现此问题是因为 GPU 在两个相邻像素之间进行插值,其中一个像素是完全透明的(所有颜色 channel 也都设置为零)。假设另一个像素是亮红色:

(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 可以;查看bleed and bleedIterations settings .您需要小心地将 bleedIterations 设置得足够高,添加足够的填充以使出血扩展到您的特定缩小级别。

现在的例子是这样的:

(255,   0,   0, 255)
(255, 0, 0, 0) // Red bled into the transparent region

插值现在根据需要提供明亮的红色透明像素:

(255,   0,   0, 128)

2。使用预乘 alpha

要做到这一点并不那么挑剔,但它有助于准确了解您在做什么。 TexturePacker 再次为您提供了 premultipliedAlpha 设置。这是 OpenGL 混合模式 glBlend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

示例中的数字不变;这仍然是出现的像素:

(128,   0,   0, 128)

然而,这不再被解释为“半透明的深红色”,而是“添加一些红色,并去除一些背景”。更一般地说,对于预乘 alpha,颜色 channel 不是“混合哪种颜色”,而是“添加多少颜色”。

请注意,像 (255, 0, 0, 0) 这样的像素不能再存在于源纹理中:因为 alpha 是预乘的,所以 alpha 为零自动意味着所有颜色 channel 都必须也为零。 (如果你真的想变得非常花哨,你甚至可以使用这样的像素在相同的渲染 channel 和相同的纹理中应用加法混合作为常规混合!)

进一步阅读预乘 alpha:

关于java - 为什么我在 libGDX 中的纹理上出现黑色轮廓/边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48415716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com