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

旋转时,OpenGL重复纹理会导致异常,opengl,3d,textures,Opengl,3d,Textures,我有一个纹理被绘制成四边形。纹理是此屏幕截图左上角的重复图案: opengl纹理只有3px乘9px,我传递的纹理坐标是非常大的数字,它通过使用GL_REPEAT在3x9纹理上循环。对截图中出现的奇怪干扰模式有什么解释吗?当四边形与摄影机完全垂直时,纹理看起来很好(完美重复)。。。屏幕截图中的四边形旋转了几度。异常似乎随着四边形到摄影机的距离的改变或旋转的改变而改变,因此我认为这与纹理采样和浮点舍入有关,但我不确定如何修复它 更新#1: 我没有使用着色器,但我目前正在python中为每个顶点使用着

我有一个纹理被绘制成四边形。纹理是此屏幕截图左上角的重复图案: 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)

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

为什么称之为异常(或者更确切地说,您希望得到什么结果)

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

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

好的,那么你要做的是旋转四边形,而不是纹理,对吗

可以在着色器中轻松地执行此操作(缺少某些部分,如采样器声明)

顶点着色器:

 out vec2 UV;
 main(){
     gl_Position = MVP * Position;
     UV = gl_Position.xy / gl_Position.w;
 }
in vec2 UV;
main(){
    outColor = texture(sampler, UV);
}
片段着色器:

 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:

使用glTexGen


使用参数(GL_S,GL_T),GL_纹理,GL_GEN_MODE,GL_OBJECT_LINEAR(我认为,如果值不正确的话,可以随意使用)

不幸的是,使用GL_LINEAR或任何mipmapping意味着遮罩将变得模糊。我真的需要遮罩的每个纹理匹配到屏幕上的单个像素。如下图所示:左图显示了整个屏幕上的遮罩,以及我试图绘制的四边形的轮廓。右图显示了绘制白色四边形(已与遮罩混合)后屏幕的外观。请参阅文章中的更新#1,不使用着色器。我的示例是否符合您认为它应该如何工作?好的,抱歉,但这不会改变任何事情。如果你同意在CPU上预处理每一帧的每个顶点,这相当于执行我给你的顶点着色器。所以gl_位置=。。。将在固定功能管道中执行,您只需更新UV坐标缓冲区。