2011-03-12 74 views
2

我用SDL + OpenGL製作了這個小遊戲。遊戲在我的個人電腦上運行良好,但在朋友的個人電腦上,他只是得到白盒子和黑屏。其他電腦上的OpenGL白色紋理

我想這可能是一個問題,因爲我的紋理是在尺寸上的2個非權力。我無法更改紋理尺寸,因此經過一些搜索後,我發現使用GL_ARB_texture_non_power_of_two會以某種方式強制(?)npot紋理。但是,令我驚訝的是,白色的盒子和東西出現在我的電腦上,他們甚至沒有和我的朋友一起走過。我無法理解問題是什麼。任何幫助將不勝感激。

代碼:

numColors = images[i]->format->BytesPerPixel; 
    if (numColors == 4) 
    { 
     if (images[i]->format->Rmask == 0x000000FF) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
    } 
    else if (numColors == 3) 
    { 
     if (images[i]->format->Rmask == 0x000000FF) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
    } 
    glPixelStorei(GL_UNPACK_ALIGNMENT,4); 
    glGenTextures(1, &textures[i]); 
    glBindTexture(GL_ARB_texture_non_power_of_two, textures[i]); 
    glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexImage2D(GL_ARB_texture_non_power_of_two, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels); 
+0

白盒PC是否支持NPOT紋理?該擴展只是 – Macke

+0

對不起,我沒有得到你.. – tf61

+0

對不起,偶然發現了鍵盤。 NPOT不是你可以啓用的東西,它是GPU支持(或不支持)的東西。那麼,NPOT是否在發生故障的GPU的擴展字符串中列出? – Macke

回答

1

你的朋友的視頻卡可能不支持兩個紋理的非權力,因此輸出仍然是錯誤的,儘管使用GL_ARB_texture_non_power_of_two擴展。

如果你的遊戲依賴於特定的OpenGL擴展才能正確顯示,你應該檢查在啓動時,告訴用戶,如果他的硬件缺乏的功能,他不能運行遊戲的擴展。

+0

我認爲功能取決於驅動程序,對吧?我問的是,因爲我看到在兩個擁有英特爾G31芯片組(GMA3100 IGP)的系統上,遊戲運行良好。 – tf61

+0

如果你想檢查擴展名:對'glGetString(GL_EXTENSIONS)'的調用將返回一個由空格分隔的擴展名字符串,你的應用程序可以在運行時解析它。 – Yuri

+0

驅動程序更新雖然沒有幫助。 – tf61

1

不要使用GL_ARB_texture_non_power_of_two代替GL_TEXTURE_2D。只需檢查是否支持擴展,然後使用glTexImage發送NPOT紋理(GL_TEXTURE_2D,w,h,...)。

調用glGetError()以查看是否出現錯誤。你應該,因爲GL_ARB _... npot不是你使用它的有效值。

GL_ARB_NPOT也用於1D和3D紋理。

+0

嗯..這意味着如果我的電腦支持NPOT紋理,我不應該使用GL_ARB。沒關係。你能提出一些建議讓我的朋友的PC上運行嗎?如果它完全不是NPOT,那麼你認爲SFML能夠繪製npot紋理嗎? – tf61

+0

@ tf61:SFML? .. – Macke

+0

我正在談論SFML(sfml-dev.org)庫。 – tf61

0

此外,以ARB_texture_non_power_of_two這裏還有另外一個分機:GL_ARB_texture_rectangle;相當古老,GPU已經支持了很多年。使用你的代碼看起來像

glPixelStorei(GL_UNPACK_ALIGNMENT,4); 
glGenTextures(1, &textures[i]); 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[i]); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels); 

BTW:GL_ARB_texture_non_power_of_two是一個擴展名,而不是用作紋理目標的有效憑證; OpenGL應該發出一個GL_INVALID_ENUM錯誤。

+1

請注意,GL_TEXTURE_RECTANGLE使用整數非標準化texcoord(即0 ...寬度而不是0..1作爲浮點數)。但它可以工作。 – Macke

+0

@Macke:哦,對。我忘了提及那個細節。 – datenwolf

+0

從OpenGL Extensions查看器看來,我的圖形芯片組似乎支持紋理矩形,但是當我使用它時,我得到了未聲明的標識符錯誤。 – tf61