2012-05-18 30 views
4

我使用Code :: Blocks(C++)和MinGW在Windows上的OpenGL中製作遊戲。所有的繪圖和邏輯都很好,遊戲完美無缺。直到突然,它沒有。經過一些隨機時間量,遊戲Segfaults。像GL段錯誤一樣,堆棧跟蹤是無益的。我唯一得到的是segfault發生在供應商的OpenGL實現中。我已經在不同廠商的多個顯卡上測試過了,他們都是這樣做的,所以問題就在我身上。glDrawArrays上的OpenGL Segfaulting

我通過gDEBugger運行程序並得到了相同的無用堆棧跟蹤。大聲笑。我也使用了GLIntercept,但沒有跳出來對我。所以我開始尋找手動方式的段錯誤(BuGLe拒絕編譯...),並基本上將跟蹤消息寫入日誌。我已經縮小到一次調用glDrawArrays。我在互聯網上做了大量的嘗試,並嘗試了很多我找到的修復方法。

因爲這個遊戲沒有爲便攜性編碼,我一直猶豫在葡萄酒和valgrind中運行它。在我開始討論這個奇妙的混亂之前,如果你能看看我的代碼並找到錯誤,我會很感激。 (我敢肯定,這東西很明顯...)

(注:爲便於閱讀,我已經刪除了所有我的跡線中)

void PlayerShip::Render() 
{ 
    glPushMatrix(); //Save the current state 

    glTranslatef(m_PosX, m_PosY, 0); 
    glRotatef(vect.Rotation - 90, 0, 0, 1); //Matrixes are applied in reverse order 


    double xl = m_SizeX/2, yl = m_SizeY/2; //Get values to add/subract to the midpoint for the corners 
    glEnable(GL_TEXTURE_2D); //Redundant 
    TextureManager::Inst()->BindTexture(TexIDs::Playership01); //Bind the texture 

    glEnableClientState(GL_VERTEX_ARRAY); //These enables and disables are redundant here 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 

    GLdouble* Verts; 
    Verts = new GLdouble[12] { -xl, -yl, -.5, xl, -yl, -.5, 
          xl, yl, -.5, -xl, yl, -.5}; //Calculate quad vertices 
    GLdouble* Texs; 
    Texs = new GLdouble[8] {0, 0, 1, 0, 1, 1, 0, 1}; //Calculate texture vertices 

    glVertexPointer(3, GL_DOUBLE, 0, Verts); 
    glTexCoordPointer(2, GL_DOUBLE, 0, Texs); 

    glDrawArrays(GL_QUADS, 0, 12); 

    delete [] Verts; 
    delete [] Texs; 

    glPopMatrix(); 
} 

有趣的是,此代碼的工作...一段時間。我打印了所有變量的值,它們都是正確的,指針不爲null,整個代碼中的glGetError調用總是返回NO_ERROR。坦率地說,我不知所措。

任何人建議我做一些不同的事情:我需要使用頂點數組來支持傳統的(1.4)GL實現,並且我將我的數組聲明爲指針,以便我可以(將來)重用它們用於一次繪製多個圖元(例如,從船上排出廢氣)

回答

6

您對glDrawArrays的最後一個參數應該是4(元素數),而不是12(浮點數)。

你試圖繪製12個元素(= 36浮點數),並訪問你的數組邊界。

+0

哇。我覺得我好笨。任何想法爲什麼它渲染一段時間,然後seg'd? – Xcelled194

+0

如果在嘗試訪問的內存區域中存在其他內容,則可能只有段錯誤。如果它是可用空間,則內存邊界檢查可能沒有注意到它。這可以解釋它的隨機性。 – Tim

+0

有道理,因爲它在內存較少的系統上會更快地發生故障......感謝你,我至少可以睡到今天晚上。 – Xcelled194

相關問題