旋转时,OpenGL重复纹理会导致异常

时间:2010-09-08 17:48:19

标签: opengl 3d textures

我有一个纹理被绘制到四边形。纹理是此屏幕截图左上角的重复图案:http://img828.imageshack.us/img828/3305/blahpv.png opengl纹理只有3px乘9px,并且我传递的纹理坐标是非常大的数字,并且它通过使用GL_REPEAT在3x9纹理上循环。截图中看到的奇怪干扰模式的任何解释?当四边形完全垂直于相机时,纹理看起来很好(重复完美)...屏幕截图是四边形旋转几度。当四边形改变它与相机的距离或旋转发生变化时,异常似乎会发生变化,因此我认为这与纹理采样和浮点舍入有关,但我不知道如何解决它。

更新#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)

3 个答案:

答案 0 :(得分:0)

嗯,不知道你应用的旋转,我们只能假设这是某种几乎不形成的莫尔图案(其中干涉网格是你的纹理和光栅化网格)。

为什么你称之为异常(或更重要的是,你想要什么结果)?

如果您想要的只是看起来更好的东西,我建议您在纹理上启用三线滤波。

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

答案 1 :(得分: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 ......

答案 2 :(得分:0)

回答#2:

使用glTexGen

http://www.dei.isep.ipp.pt/~matos/cg/docs/manual/glTexGen.3G.html

带有参数(GL_S,GL_T),GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR的

(我认为;如果不正确则使用值进行游戏)