2011-04-09 232 views

回答

1

您可以納入範圍檢查到您的着色器。設置clamp_to_edge會影響只從採樣中返回的像素,因此,當您處於不想輸出任何像素的區域時,進入着色器的紋理座標仍然會在零到一的範圍之外。在今天常用於GL ES的硬件上,傳遞alpha爲0的顏色比丟棄更快,所以如果你的混合模式允許的話。

E.g.假設您目前只是最微不足道的紋理片段着色器:

void main() 
{ 
    if(clamp(texCoordVarying, vec2(0.0, 0.0), vec2(1.0, 1.0)) == texCoordVarying) 
     gl_FragColor = texture2D(tex2D, texCoordVarying); 
    else 
     gl_FragColor = vec4(0.0); // or discard, if you need to 
} 

然而,一個明確的範圍檢查將增加處理成本:

void main() 
{ 
    gl_FragColor = texture2D(tex2D, texCoordVarying); 
} 

你可以用,而不是走。顯然,只有當它成爲問題時纔會擔心,但在這種情況下,解決方案只是在紋理中添加邊框。所以如果你的紋理是256x256,那麼你會使用中心254x254像素,並在外面放置一個完全透明的邊框。

編輯:更清楚地思考,如果alpha而不是丟棄是可以接受的,那麼你可以使用step函數來消除條件。重複四次 - 對每個軸上的每個限制一次,將想要的結果反轉爲大於測試的結果而不是小於,然後將輸出alpha乘以全部四個結果。如果任何一個爲零,則輸出alpha將爲零。

+0

再次感謝湯米 – user696142 2011-04-09 23:38:02

0

改爲使用CLAMP_TO_BORDER,不要忘記設置邊框顏色。

+0

謝謝kvark – user696142 2011-04-09 23:38:22

+0

不幸的是,GL ES省略了邊界。請參閱http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml - 「指定邊框的寬度,必須爲0」。 – Tommy 2011-04-10 07:08:50

+0

@Tommy。哦,我又壞了... – kvark 2011-04-10 12:26:55