2011-03-22 79 views
0

嗨,大家好和女孩我的問題是我已經成功加載3個BMP紋理(或至少我希望我已經使用char* textureFilenames[textureCount] = {"cement.bmp","hedge.bmp","sky.bmp"}; 和我目前使用開放GL選擇紋理

glTexCoord2f(0.0,0.0); 
    glVertex3f(-150.0, 0.0, -150.0); 
    glTexCoord2f(1.0,0.0); 
    glVertex3f(-150.0, 0.0, 150.0); 
    glTexCoord2f(1.0,1.0); 
    glVertex3f(150.0, 0.0, 150.0); 
    glTexCoord2f(0.0,1.0); 
    glVertex3f(150.0, 0.0, -150.0); 

應用它但它目前只拿起sky.bmp反正有我可以選擇其他的嗎?

+3

是否有任何理由,爲什麼您創建一個新用戶#1對每個問題?我的意思是,你的問題包含http://stackoverflow.com/q/5388799/524368和http://stackoverflow.com/q/5384206/524368中的一小段代碼 - 你顯然是同一個人。 – datenwolf 2011-03-22 14:48:06

+0

[opengl紋理]可能的重複(http://stackoverflow.com/questions/5380717/opengl-texturing) – genpfault 2011-03-22 15:13:53

+0

在我回答之前沒有注意到所有的模糊:/ – luke 2011-03-22 15:29:28

回答

4

OpenGL是一個state machine。當前的紋理是OpenGL的狀態的一部分。你glBindTexture()綁定最後的紋理將被使用直到你與另一個人結合爲止

glBindTexture(GL_TEXTURE_2D, cement_texture_id); 

// ... following geometry will use the cement texture 

glBindTexture(GL_TEXTURE_2D, hedge_texture_id); 

// ... hedge texture 

glBindTexture(GL_TEXTURE_2D, sky_texture_id); 

// ... sky texture 

OpenGL RedBook」的a chapter在紋理映射上覆蓋了基礎知識。

+0

根據其餘模型中的代碼判斷,在GLuint theTexture [textureCount]中有一組紋理id, – luke 2011-03-22 16:00:32

1

你錯誤在於你對OpenGL缺乏瞭解。 OpenGL不是場景圖!最好把OpenGL想象成一套繪圖工具,在一個名爲幀緩衝區的畫布上繪畫。

所以在使用OpenGL時,您必須將自己的思想置於與使用鉛筆,橡皮擦,畫筆和顏料繪製圖片類似的狀態。首先你準備你的工具:紋理就像「色彩片」,頂點的網格就像一些微妙的「刷子」。

就像藝術家一樣,第一步就是準備好你的工具。如果使用頂點緩衝區對象,則使用glBufferData將它們加載到快速內存中,然後使用顏料和染料,即紋理,準備幾何圖形(即網格)。這就是你在「初始化」階段所做的事情(我更喜歡按需執行此操作,以便用戶看不到「加載」屏幕)。

首先你加載所有的對象(VBO中的幾何體,紋理等);您只需爲每個需要的對象執行一次操作,即一旦對象準備好(即完成),您就不必重新上傳對象。

然後在每個每個描繪迭代對象要繪製綁定所需的OpenGL 對象他們目標,然後執行繪圖調用,然後將使用當前綁定的對象執行。

即這樣的事情,請用常理來填寫在你的頭腦中缺少的功能:

struct texture; // some structure holding texture information, details don't matter here 
struct geometry; // structure holding object geometry and cross references 

texture *textures; 
geometry *geometries; 

texture * load_texture(char const *texture_name) 
{ 
    texture *tex; 

    if(texture_already_loaded(textures, texture_name)) 
     tex = get_texture(texture_name); 
    else 
     tex = load_texture_data(textures, texture_name); 

    return tex; 
} 

geometry * load_geometry(char const *geometry_name) 
{ 
    geometry * geom; 

    if(geometry_already_loaded(geometries, geometry_name)) 
     geom = get_geometry(geometry_name); 
    else 
     geom = load_geometry_data(geometries, geometry_name) 

    if(geom->texture_name) 
     geom->texture = load_texture(geom->texture_name); 

    return geom; 
} 

void onetime_initialization() 
{ 
    for(geometry_list_entry * geom = geometry_name_list; geom ; geom = geom->next) 
     geom->geometry = geometry_load(geom->name); 
} 

void drawGL() 
{ 
    glViewport(...); 
    glClearColor(...); 
    glClear(...); 

    glMatrixMode(GL_PROJECTION); 
    // ... 

    glMatrixMode(GL_MODELVIEW); 
    // ... 

    for(geometry_list_entry * geom = geometry_name_list; geom ; geom = geom->next) 
    { 
     glMatrixMode(GL_MODELVIEW); // this is not redundant! 
     glPushMatrix(); 

     apply_geometry_transformation(geom->transformation); // calls the proper glTranslate, glRotate, glLoadMatrix, glMultMatrix, etc. 

     glBindTexture(GL_TEXTURE_2D, geom->texture->ID); 
     draw_geometry(geom); 

     glMatrixMode(GL_MODELVIEW); // this is not redundant! 
     glPopMatrix(); 
    } 

    // ... 

    swapBuffers(); 
}