如何在着色器代码中替换纹理中的颜色?

时间:2012-05-31 02:22:49

标签: android opengl-es-2.0

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

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

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

任何人都可以给我一些关于通常这样做的线索吗?我宁愿在着色器中执行此操作的原因是我可以确保掩码像素颜色始终保持黑色。

我对OpenGL ES 2.0很陌生,但我正在努力学习如何运作。请牢记这一点,并帮助我学习。提前致谢。

1 个答案:

答案 0 :(得分:1)

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

我会创建一个单一通道图像,其中遮罩区域为1,未遮罩区域为0。

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

这有点缓解了使用GL_LINEAR的问题,因为您可以调整拒绝像素的值。

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