2013-06-28 66 views
0

在網站上的第一個問題,所以我很抱歉,如果我做任何非常規的事情。我決定發佈最少量的實際代碼,並且鏈接到我遵循的教程,因爲我會發布大量文件。對於那些與我同在的人,你不知道我多麼感激它。客觀的C++ OpenGL實現

我目前正在爲C++開發一個跨平臺引擎,用於圖形渲染,更多的是一個有趣的項目而不是必需品。我的主要開發平臺是我的Macbook Pro,所以我決定我想實現的引擎的第一部分是Mac端口。因爲我希望應用程序的行爲類似於本地應用程序,所以我決定使用Cocoa作爲前端。

我跟着this tutorial,它與它附帶的演示以及lazyfoo網站上的第一個教程很好地配合。我在一年前完成了教程,但我想檢查並確保我知道如何實施我後來學到的東西。

直到我得到the second tutorial我有問題。所以編輯tut01_renderer類,到目前爲止,我添加了一個變量,lazyfoo在他的教程中使用的整數gColorMode變量,用於在他的渲染方法中進行比較。我試圖在頭文件中將gColorMode初始化爲0(青色),tut01renderer init方法或兩者。最後,在該tut01renderer渲染方法,我把一個if/else語句:

if(gColorMode == 0) 
    { 

    //Solid Cyan 
     glBegin(GL_QUADS); 
     glColor3f(0.f, 1.f, 1.f); 
     glVertex2f(-0.5f, -0.5f); 
     glVertex2f( 0.5f, -0.5f); 
     glVertex2f( 0.5f, 0.5f); 
     glVertex2f(-0.5f, 0.5f); 
     glEnd(); 
    } 
    else 
    { 
     //RYGB Mix 
     glBegin(GL_QUADS); 
     glColor3f(1.f, 0.f, 0.f); glVertex2f(-0.5f, -0.5f); 
     glColor3f(1.f, 1.f, 0.f); glVertex2f( 0.5f, -0.5f); 
     glColor3f(0.f, 1.f, 0.f); glVertex2f( 0.5f, 0.5f); 
     glColor3f(0.f, 0.f, 1.f); glVertex2f(-0.5f, 0.5f); 
     glEnd(); 
    } 

這帶來了3場景,當我運行,不管我怎麼初始化gColorMode,每個3的發生。

1)它崩潰到malloc錯誤,編輯一個被釋放的對象或者彙編中的訪問錯誤。 2)顯示青色方塊應該是它應該的 3)顯示多方塊!

我甚至使gColorMode一個常量,它仍然有時顯示多方形或崩潰!

所以我的問題是如果我做錯了什麼或聽到的。我可以在渲染方法中使用if/else語句嗎?原始的骨架代碼演示使用變量,但不是如果/ else語句?有沒有關於Objective C++的東西,使我想做的事情變得不可能?或者是別的?

(最後,我會很樂意重新實現,這是純C和Objective C如果有人足夠好的教程知道。明顯不是我的引擎在C++中,但它可能是更容易的整體去使用這種方法。)

+0

我建議迅速從你使用的舊的和過時的OpenGL功能移開(稱爲「固定功能管線」)和閱讀的現代的OpenGL編程的精彩教程:http://www.arcsynthesis.org/gltut/ –

+0

我沒有看到你的方法有什麼問題,它應該工作。如果你想讓我不介意快速瀏覽你的項目。然而,正如Victor Sand所說,建議您從舊的OpenGL風格開始。從mac的角度看,arcsynthesis的教程有點混亂。右側的http://www.reddit.com/r/opengl側欄有一些很棒的教程,您可以查看這些內容。 – TheAmateurProgrammer

+0

由於我能夠在一個全新的項目文件中重做程序,所以它一定出錯了。通常,當我遇到標題錯誤時,我會收到這些隨機錯誤。我仍然無法找到有問題的特定錯誤,但幸運的是我有一個工作程序。感謝大家的幫助! (絕對是在學習GLSL) – TheLostDays

回答

0

調用OpenGL函數時,你可以使用任何你想要的控制結構(if/else,for loops等),只要你不弄亂順序。例如。對於每個glBegin()必須有相應的glEnd(),並且glVertex必須在glBeginglEnd之間調用。你發佈的代碼看起來很好。假設你的代碼有錯誤,它必須在別的地方。

我會將gColorMode設置爲0,並在繪製多彩色方塊的位置設置一個斷點。瞭解它爲何走上了這條道路。您也可以設置一個數據斷點,當gColorMode更改時觸發。如果沒有告訴你什麼,用調試器遍歷你的代碼,找出哪個函數調用導致這個「訪問錯誤」。

我不知道還有什麼要告訴你,而不能看更多的代碼。