Opengl纹理查找掩码

时间:2015-08-24 10:53:02

标签: opengl interpolation

我的纹理有不需要的黑色像素。我想在使用线性插值ON的tex2d或tex3d时放弃它的影响。问题是黑色和白色相遇的边缘是插值。我不想将查找设置为POINT。

enter image description here

1 个答案:

答案 0 :(得分:2)

我可以想到两个概念解决方案:

  1. 限制tex-coords从不从任何包含不需要的“边框”像素的位置进行采样。这可以通过将tex坐标夹到可用范围最外面的纹素的中心来完成。

    a)直接修改tex-coords。这不需要对着色器进行任何修改(并且可以使用固定功能管道)。但是,这意味着您丢失了像素精确的映射,并在水平和垂直方向上丢失了一个像素。

    b)在着色器中对纹理进行采样之前,直接对texcoords进行抄写。这要求着色器可以使用可用范围的信息。但是,对于图片所示的轴对齐矩形,可以用vec4表示。由于这是纹理的属性,因此使用制服似乎是合适的。也许你甚至可以在着色器中使用常量。

  2. 取样后“修复”该值。现在这可能听起来像一个复杂而困难的操作,但实际上,它很容易实现。你需要一个额外的面具,它在纹理有效的地方为1,黑色边框为0。如果您最多只使用3个通道,则可以将其添加为第四个纹理通道。否则,您可能需要额外的纹理(具有相同的过滤器设置)。这还要求纹理中的“不需要的”数据始终为黑色,因此对插值贡献0。在这种情况下,您需要0/1-mask的样本,并且可以使用它来简单地重新标准化实际颜色的样本

    vec4 color = texture(samplerColor, texCoord);
    float mask = texture(samplerMask, texCoord).r; // or mask = color.a
    vec4 fixed_folor = color / mask;
    

    这甚至适用于更复杂的过滤器,如mipmapping和各向异性过滤。