1

我正在编写一个简单的图像查看器,用于在 Android 上的 OpenGL ES 2.0 中的几个三角形上显示图像。这些图像中有一种特定的颜色,必须以某种方式替换为黑色。问题是,如果 GL_LINEAR 用于我的最小和最大化过滤器,则需要替换的颜色的轮廓仍然可见。如果我将 GL_NEAREST 用于我的过滤器,着色器可以轻松替换颜色,但是它不会将图像渲染得平滑,并且在放大和缩小时当然看起来像素化。

我想知道是否有更好的方法来执行此类任务。我的一些想法是:

  • 构建另一个仅在纹理像素上运行一次并在我的片段着色器期间实际使用纹理之前替换颜色的着色器?
  • 重写我的着色器,使其即使在使用 GL_LINEAR 时也能正常工作。

谁能给我任何关于这通常是如何完成的线索?我宁愿在着色器中执行此操作的原因是我可以确保遮罩像素颜色始终保持黑色。

我对 OpenGL ES 2.0 还是很陌生,但我正在尝试了解事情是如何工作的。请记住这一点,并帮助我学习。提前致谢。

4

1 回答 1

1

在那种情况下(面具总是在同一个地方),我认为你有更多的选择。

我将创建一个单通道图像,其中蒙版区域为 1,未蒙版区域为 0。

然后在shader中,你对原始纹理和蒙版纹理进行采样,如果蒙版值大于某个阈值,你可以用自己的蒙版颜色替换。

这在一定程度上缓解了使用 GL_LINEAR 的问题,因为您可以调整拒绝像素的值。

例如,如果您在蒙版和未蒙版像素之间进行采样,那么您的蒙版值为 0.5,颜色将为 (0.5*color_key + 0.5*unmasked_color)。如果您发现这种不可接受的颜色渗色,您可以将 alpha 拒绝设置为 0.1、0.001 等,以遮盖其中甚至有轻微遮罩痕迹的任何像素。这会稍微扩大您的蒙版区域,但会让您在结果中的任何地方都看不到颜色键的痕迹。

于 2012-05-31T02:49:03.190 回答