2015-08-24 80 views
0

我有一個有不需要的黑色像素的紋理。我想放棄它的影響,當我做一個tex2d或tex3d線性插值ON。問題出現在黑色和白色相遇的插入值的邊緣。我不想設置POINT的查找。Opengl紋理查找掩碼

enter image description here

回答

2

我能想到兩個概念的解決方案:

  1. 限制TEX-COORDS永遠不會從這項工作將合併不必要的「邊界」像素的任何位置進行採樣。這可以通過將tex座標系夾緊到中心來完成。

    a)通過直接修改tex-coords。這將不需要對着色器進行任何修改(並且可以與固定功能管線一起使用)。但是,這意味着您將失去一個像素精確的映射並在水平和垂直方向上丟失一個像素。

    b)通過在着色器中對紋理進行採樣之前直接夾取texcoords。這要求着色器可以使用可用範圍的信息。但是,如圖所示,在軸對齊的矩形的情況下,這可以用vec4表示。由於這是紋理的屬性,因此使用制服似乎是合適的。也許你甚至可以在着色器中使用常量。

  2. 「修復」採樣後的值。現在這聽起來像是一個複雜而困難的操作,但實際上,這很容易完成。你需要一個額外的遮罩,在你的紋理有效的地方是1,而在黑色邊框是0的地方。如果您最多隻使用3個通道,則可以簡單地將其添加爲第四個紋理通道。否則,您可能需要額外的紋理(使用相同的過濾器設置)。這也要求紋理中的「不需要」的數據總是黑色的,所以對插值貢獻0。在這種情況下,需要進行0/1-掩模的樣品,可以用它來重新歸一化acutal顏色的樣品簡單地通過

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

    這甚至與像紋理映射和各向異性過濾更復雜的過濾器的工作原理。