2011-07-29 68 views
0

我想創建一個工具,將在openGL中繪製一個形狀,然後修改窗體中該形狀的屬性的值。所以如果我的形狀是矩形,我將創建一個表單,允許用戶控制矩形的大小,顏色等。我用託管的C++編寫了openGL代碼,並在c#中編寫了表單,並且由於其中一些形狀變得更加複雜,我決定爲它們製作顯示列表(出於性能和可預測性目的)。顯示列表將不會運行

我在形狀的構造函數中定義顯示列表,然後在render方法中調用顯示列表。

我的問題是我的顯示列表根本不會運行。我在顯示列表之外渲染的部分將被渲染,但顯示列表中的部分將不會渲染。

這裏是我的過程的一些示例代碼:

//c# side 
GLRectangle rect 
public CSharpRectangle() { 
    rect = new GLRectangle(); 
} 

//managed c++ side 
public GLRectangle() { 
    width = 50; 
    height = 50; 
    //initialize more values 
    rectDL = glGenLists(1); 
    glNewList(rectDL, GL_COMPILE); 
     renderRect(); 
    glEndList(); 
} 
public render() { 
    //Draw border 
glBegin(GL_LINE_LOOP); 
    glVertex2f(0, 0); 
    glVertex2f(width, 0); 
    glVertex2f(width, height); 
    glVertex2f(0, height); 
glEnd(); 

    //Draw interior 
    glCallList(rectDL); 
} 
private renderRect() { 
    glRectf(0,0,width,height); 
} 

在這個例子中,矩形的邊框將呈現,但矩形本身不會被渲染...如果我更換顯示列表只需要一個方法調用,矩形就會呈現出來。有誰知道爲什麼會發生這種情況?

+2

你可以發佈你的renderRect函數嗎?這可能會有所幫助。 – Dany

+0

添加了renderRect方法。 – eternalking

回答

1

我想給我2美分。

您的問題中的代碼似乎對我來說是正確的,所以可能在您的應用程序中有其他的東西使您的顯示列表無法運行。

我唯一能想到的是在編譯顯示列表時(實際上在執行GlRectangle構造函數時)沒有當前上下文。那麼,在同一個線程中執行的例程是否已經調用glMakeCurrent?在glMakeCurrent之後調用該例程嗎?

此外,在每個OpenGL例程之後檢查glGetError以驗證操作。在這種情況下,它返回一個錯誤,你可以知道你的代碼有什麼問題。

+0

這就是問題所在,在我實例化形狀後創建了上下文。我的實際程序比我給出的例子複雜得多,所以我一開始並沒有注意到它。謝謝你的幫助! – eternalking

-2

你可能得不到你想要的東西的原因很簡單,因爲它不在那裏了。在我閱讀openGL紅皮書的時候,我注意到顯示列表在openGL3.1及更高版本(意味着簡單的刪除)中被棄用,並且通過谷歌搜索來確認它。我不記得理由了,但我相信因爲它與VAO和VBO搞混了。所以如果你使用的是高於opengl 3.1的版本,你將不會再獲得顯示列表。

+0

-1,不贊成使用顯示列表,但爲了兼容性而仍支持各種顯示列表。已棄用意味着他們在那裏,但建議不要使用它們 – Hannesh

+0

仔細閱讀,不贊成使用意味着它們被刪除並建議不要使用它們。無論誰(ATI,Nvidia,...)決定刪除它們,他們都可以自由做,而ATI與他們表現不佳。除非你不想使用舊的OpenGL版本,否則你不應該在棄用的東西上建立一個新的項目。如果他們會保持兼容性,對於已棄用的所有內容,將會有什麼想法? – Raven

+1

@Raven棄用與您用作渲染器的當前OpenGL版本相關。棄用從3.0開始引入,因此較低版本應支持棄用的API。除了使用兼容性配置文件之外,您不能在向前兼容的上下文中使用棄用的功能。 – Luca