2011-11-07 124 views
2

我剛開始使用OpenGL,但在實現Font系統後遇到問題。無紋理的四邊形顯示爲黑色

我的計劃是簡單地將幾種尋路算法可視化。

目前的OpenGL被設置這樣的(篩上部分被手動上窗口創建調用一次):

void GLWindow::OnSize(GLsizei width, GLsizei height) 
{ 
    // set size 
    glViewport(0,0,width,height); 

    // orthographic projection 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0,width,height,0.0,-1.0,1.0); 
    glMatrixMode(GL_MODELVIEW); 

    m_uiWidth = width; 
    m_uiHeight = height; 
} 

void GLWindow::InitGL() 
{ 
    // enable 2D texturing 
    glEnable(GL_TEXTURE_2D); 
    // choose a smooth shading model 
    glShadeModel(GL_SMOOTH); 
    // set the clear color to black 
    glClearColor(0.0, 0.0, 0.0, 0.0); 

    glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_GREATER, 0.0f); 
} 

從理論上講,我不需要混合,因爲我只會用無紋理的四邊形可視化障礙和線等等來繪製路徑...所以一切都將被無紋理,除了字體...

字體類具有推和彈出功能,看起來像這樣(如果我記得對我的字體系統是基於NeHe教程,我剛纔跟隨):

inline void GLFont::pushScreenMatrix() 
{ 
    glPushAttrib(GL_TRANSFORM_BIT); 
    GLint viewport[4]; 
    glGetIntegerv(GL_VIEWPORT, viewport); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    glOrtho(viewport[0],viewport[2],viewport[1],viewport[3], -1.0, 1.0); 
    glPopAttrib(); 
} 

inline void GLFont::popProjectionMatrix() 
{ 
    glPushAttrib(GL_TRANSFORM_BIT); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glPopAttrib(); 
} 

所以問題: 如果我沒有繪製文本,我可以看到我想繪製的四邊形,但它們非常暗,所以我的一般OpenGL矩陣屬性一定有問題。 如果我繪製文本(所以調用字體相關的推送和彈出功能),我看不到任何四邊形。

問題: 如何解決這個問題和一些背景信息,爲什麼發生這種情況也會很好,因爲我仍然是一個初學者/學生,他們剛剛起步。

+0

僅供參考:即使您看到在窗口的resize處理程序中設置視口和投影矩陣的教程,請不要複製該樣式。這些東西應該像繪畫功能一樣,可以被認爲是「準備畫布」。從長遠來看,這種方法將爲您節省很多頭痛,相信我。 – datenwolf

回答

3

如果你的四邊形是無紋理的,你會遇到未定義的行爲。可能會發生的是,將使用任何先前的紋理,並且將使用點(0,0)處的顏色,這可能是導致它們不可見的原因。

真的,你需要在試圖使用glDisable(GL_TEXTURE_2D)繪製無紋理的四邊形之前禁用紋理。再一次,如果你不這樣做,它只會使用先前的紋理和紋理座標,而沒有看到你的draw()循環,我假定它是未定義的。

+0

感謝解決它,不知何故從來沒有想過... – niktehpui

+0

只是想我會詳細闡述一點,因爲我已經重新讀過這個。點(0,0)不一定會被使用,更多的是,將使用先前發佈的紋理座標。這是未定義的,但如果在glBegin()和glVertex()調用之間沒有設置texcoord。 – slugonamission

相關問題