答案 0 :(得分:2)
我可以想到两个概念解决方案:
限制tex-coords从不从任何包含不需要的“边框”像素的位置进行采样。这可以通过将tex坐标夹到可用范围最外面的纹素的中心来完成。
a)直接修改tex-coords。这不需要对着色器进行任何修改(并且可以使用固定功能管道)。但是,这意味着您丢失了像素精确的映射,并在水平和垂直方向上丢失了一个像素。
b)在着色器中对纹理进行采样之前,直接对texcoords进行抄写。这要求着色器可以使用可用范围的信息。但是,对于图片所示的轴对齐矩形,可以用vec4表示。由于这是纹理的属性,因此使用制服似乎是合适的。也许你甚至可以在着色器中使用常量。
取样后“修复”该值。现在这可能听起来像一个复杂而困难的操作,但实际上,它很容易实现。你需要一个额外的面具,它在纹理有效的地方为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和各向异性过滤。