2014-01-12 49 views
1

我聽說你需要兩個紋理尺寸的力量才能在OpenGL中工作。但是,我已經能夠加載200x200和300x300(不是2的冪)的紋理。與此同時,當我嘗試使用相同的代碼加載512x512(兩個冪次)的紋理,但數據不會加載(按照我使用DevIL加載這些PNG的方式)。我一直無法找到任何能夠告訴我加載哪種類型的尺寸的東西。我也知道你可以剪裁紋理並添加邊框,但我不知道最終的尺寸應該是多少。什麼紋理尺寸可以OpenGL處理​​

這裏是負載的功能:

void tex::load(std::string file) 
{ 
    ILuint img_id = 0; 
    ilGenImages(1,&img_id); 
    ilBindImage(img_id); 
    ilLoadImage(file.c_str()); 
    ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE); 
    pix_data = (GLuint*)ilGetData(); 
    tex_width = (GLuint)ilGetInteger(IL_IMAGE_WIDTH); 
    tex_height = (GLuint)ilGetInteger(IL_IMAGE_HEIGHT); 
    ilDeleteImages(1,&img_id); 
    //create 
    glGenTextures(1,&tex_id); 
    glBindTexture(GL_TEXTURE_2D,tex_id); 
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,tex_width,tex_height,0,GL_RGBA,GL_UNSIGNED_BYTE,pix_data); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glBindTexture(GL_TEXTURE_2D,NULL); 
} 
+0

在較新版本的OpenGL中,圖像不需要是「兩個冪」(雖然它也取決於GPU等)......但是如何加載和處理圖像/紋理?如果沒有看到正在使用的實際代碼,很難告訴你有什麼問題。 – Vallentin

+0

查詢'MAX_TEXTURE_SIZE',它可以讓你知道2D紋理支持的最大寬度/高度。一些非常老的GPU不支持512x512,但現在最支持的是2048x2048 - 16384x16384之間的某個地方。你可以在這裏看到統計信息[here](http://feedback.wildfiregames.com/report/opengl/feature/GL_MAX_TEXTURE_SIZE)。 –

+0

3379是最大紋理尺寸 – 0ctoDragon

回答

0

有一些來源不說,最大或至少可以如何看着辦吧,你的第一步應該是OpenGL的規範,但對於這將是很高興知道您的目標是哪個OpenGL。據我所知OpenGl有一個最小最大硬編碼的紋理大小,這是64x64,實際最大的實施是由GL_MAX_TEXTURE_SIZE負責告訴你,你可以使用glGet *函數,這會告訴你最大功率爲2實現可以處理的紋理。

在這個OpenGL本身之上本身從來沒有提到兩個紋理的非功率,除非它是更新的opengl版本的核心功能,或者它是一個擴展。

如果你想知道什麼組合再次被實際支持,請參考適當的規範,它會讓你知道如何獲得該信息。

+2

自2.0以來,非Power-of-Two紋理一直是OpenGL的核心要求。儘管那個時代許多聲稱符合OpenGL 2.0的GPU沒有適當地支持它們......主要是ATI GPU。 –

+1

對OpenGL中最小紋理尺寸沒有要求。然而,對最小支持的最大紋理尺寸有要求(即沒有OpenGL實現必須支持小於64×64的紋理尺寸)。 – datenwolf

+0

@Andon M. Coleman根據我的個人經驗,我可以證實這是真實的。 datenwolf,謝謝我會解決這個問題。 – DrakkLord