2013-03-03 73 views
2

我已经加载了纹理,并将其显示在立方体和平面上。在飞机和立方体相交的地方,有一些丑陋的视觉工件。OpenGL在纹理inteinter处失败

这里有两张图片展示了这个问题:

图片1 - 这是什么:

Image1 - what is this?

图片2 - 相同的情况下,其他的观点:

Image2 - how to fix?

这里是我如何加载图像:

static const GLenum gl_format[4] = { GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGR, GL_BGRA }; 

GLuint LoadTGATexture(const char* filename) 
{ 
    //image is already loaded in --- unsigned char[] data - int width - int height - int components 
    unsigned int handle; 

    glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy); 

    glGenTextures(1, &handle); 
    glBindTexture(GL_TEXTURE_2D, handle); 

    glTexImage2D(GL_TEXTURE_2D, 0, components, width, height, 0, gl_format[components - 1], GL_UNSIGNED_BYTE, data); 
    gluBuild2DMipmaps(GL_TEXTURE_2D, components, width, height, gl_format[components - 1], GL_UNSIGNED_BYTE, data); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); 
    glBindTexture(GL_TEXTURE_2D, 0); 

    delete [] data; 
    return handle; 
} 

但我该如何解决这个问题,以及我的错误是什么?

+2

只是一个猜测,但是你有没有机会拥有一个远近矩阵和远近剪裁平面之间的**巨大差异? – antonijn 2013-03-03 15:35:55

+0

是的,我有0.00001和10000.0 - >太大 - 但如果飞机与另一个完全重叠,仍然有一些条纹(接近0.01和远远100.0) – bricklore 2013-03-03 16:43:00

+2

“远”真的不是什么大问题,真正的问题是“接近” - 如果将近平面设置为0.01,则即使您的远平面非常接近,您的z缓冲区范围的约50%也在0.01和0.02之间。 – JasonD 2013-03-03 16:54:56

回答

3

我猜测它跟你的纹理没有任何关系。

由它的外观你有一个剪辑问题。我会验证glEnable(GL_DEPTHTEST),确保在设置透视矩阵时您的近平面是>0.0,这意味着不是0.0而不是负数。还要确保你的远飞机不是一些疯狂的巨大数字。我通常在1000.0停止并取得好成绩。你可能想要做些小事。

+0

谢谢!现在真的好多了!但如果飞机与另一架飞机完全重叠,还是会有一些条纹......有什么建议? – bricklore 2013-03-03 16:41:16

+2

@ Schnizel1337如果飞机完全重叠,实际上并没有什么可以做的。你会遇到一个叫做“z战斗”的问题。去谷歌上查询。您通常希望避免几何体的精确重叠。 – Bart 2013-03-03 16:51:24

+3

这不是所谓的裁剪,而是深度战斗。此外,远平面距离对于这个近平面距离而言更不重要。深度缓冲区分辨率与1/x一致,所以将近平面移动到原点越近,您在远处释放的深度分辨率就越高。在远剪切平面上,精度接近线性级数,因此远距离较大时的精度下降并不那么关键。因此,您应该选择尽可能大的近夹平面距离,而不是> 0。 – datenwolf 2013-03-03 17:24:43