2010-09-08 56 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