2013-03-03 24 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