2010-09-08 41 views
1

我有一個正在繪製到四邊形的紋理。紋理是此截圖左上角的重複圖案:http://img828.imageshack.us/img828/3305/blahpv.png opengl紋理僅爲3px乘9px,我傳遞的紋理座標非常大,它使用GL_REPEAT在3x9紋理上循環。對截圖中看到的奇怪干擾模式的任何解釋?當四邊形完全垂直於相機時,紋理看起來很好(重複完美)...截圖是四邊形旋轉了幾度。當四邊形改變它到相機的距離或旋轉改變時,異常情況似乎會改變,所以我認爲它與紋理採樣和浮點四捨五入有關,但我不知道如何解決它。OpenGL重複紋理導致旋轉時出現異常

更新#1:

我不使用着色器,但是這是我當前如何做的Python爲每個頂點:

(x0, y0, z0) = gluProject(vert[0].x, vert[0].y, 0.0) 
x0 /= maskTextureWidth # 3.0 
y0 /= maskTextureHeight # 9.0 
glMultiTexCoord2f(GL_TEXTURE1_ARB, x0, y0) 
glVertex2f(vert[0].x, vert[0].y) 

回答

0

好了,不知道您應用的旋轉,我們只能假設這是幾乎沒有形成的莫爾圖案(其中干涉柵格是你的紋理和柵格化柵格)。

爲什麼你稱之爲異常(或者更重要的是,你希望結果如何)?

如果你想要的只是看起來更好,我建議打開你的紋理的三線過濾。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
+0

不幸的是,使用GL_LINEAR或任何mipmapping意味着面具將會模糊。我真的需要面具的每個紋理元素與屏幕上的一個像素相匹配。像這樣: http://img101.imageshack.us/img101/6499/30831346。png 左圖顯示了整個屏幕上的遮罩以及我試圖繪製的四邊形輪廓。正確的圖像顯示了繪製白色四邊形(已與面具混合)後屏幕的外觀。 – bparker 2010-09-09 18:38:11

0

好吧,所以你要旋轉四邊形而不是紋理,對吧?

你可以在你的着色器輕鬆地做到這一點(有些部分缺失,如採樣聲明)

頂點着色器:

out vec2 UV; 
main(){ 
    gl_Position = MVP * Position; 
    UV = gl_Position.xy/gl_Position.w; 
} 

片段着色器:

in vec2 UV; 
main(){ 
    outColor = texture(sampler, UV); 
} 

更重要的是,你甚至不需要提供紋理座標:它們是在運行時計算的。

另一種可能性是,如果你沒有着色器,侵入性更小,就是重新計算你的UV,就像在頂點着色器中一樣。

另一種可能性是glBitmap,但是這是一些非常一塊API的...

+0

查看帖子中的更新#1,不使用着色器。我的例子與你認爲它應該如何工作? – bparker 2010-09-10 19:50:26

+0

好的,對不起,但這並沒有改變任何東西。它同意預處理CPU上每個幀的每個頂點,這相當於執行我給你的頂點着色器。所以gl_Position = ...將在固定功能管道中執行,您只需更新UV座標緩衝區。 – Calvin1602 2010-09-10 21:35:02

+0

@bparker:查看其他答案 – Calvin1602 2010-09-10 21:36:55