基本上試圖在飛機上做一個貼紙。紋理圖像顯示在飛機上(可以四處移動),但我不想將圖像拉伸到邊緣或重複它。我如何才能像貼紙一樣在牆上留下圖像?我使用着色器,不知道這是否是我解決問題的地方。想象一下,一個棋盤是我的形象,這是發生了什麼:OpenGL中的貼紙/貼花:從CLAMP_TO_EDGE拉伸紋理沒有拉伸?
http://i.stack.imgur.com/bBDM0.gif
基本上試圖在飛機上做一個貼紙。紋理圖像顯示在飛機上(可以四處移動),但我不想將圖像拉伸到邊緣或重複它。我如何才能像貼紙一樣在牆上留下圖像?我使用着色器,不知道這是否是我解決問題的地方。想象一下,一個棋盤是我的形象,這是發生了什麼:OpenGL中的貼紙/貼花:從CLAMP_TO_EDGE拉伸紋理沒有拉伸?
http://i.stack.imgur.com/bBDM0.gif
您可以納入範圍檢查到您的着色器。設置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將爲零。
改爲使用CLAMP_TO_BORDER,不要忘記設置邊框顏色。
謝謝kvark – user696142 2011-04-09 23:38:22
不幸的是,GL ES省略了邊界。請參閱http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml - 「指定邊框的寬度,必須爲0」。 – Tommy 2011-04-10 07:08:50
@Tommy。哦,我又壞了... – kvark 2011-04-10 12:26:55
再次感謝湯米 – user696142 2011-04-09 23:38:02