2011-06-05 46 views
1

我在設置OpenGL上下文和使用Snow Leopard在MacOSX上正確使用它時遇到了一些問題和疑問。網上有很多不同的教程和代碼,它們的範圍從10.4到10.6不等。我打算不使用GLUT來處理我的外圍交互並處理我的GL上下文。如何使用gluOrtho2D(像素空間)在Mac OSX(Snow Leopard)上啓動OpenGL上下文

爲了解決手頭的問題,我希望能夠做的就是能夠在調整窗口大小時畫出我的場景。由於某種原因,我的重塑功能無法正常工作。我也不知道我是否應該在界面生成器中使用NSOpenGLView或CustomView。從我收集的內容看來,如果您需要超過您可以在NSOpenGLView對象中選擇的默認渲染屬性,那麼您應該使用CustomView。在我的情況下,我已經將子類NSOpenGLView並將我的類連接到IBuilder中的此對象。

無論如何,下面是我的代碼。如下所述,我真的希望能夠在正交空間(像素空間)和透視圖(世界空間)之間來回移動。嘗試使用gluOrtho2D()(隱式函數聲明)時,我收到警告。我不知道如何讓這個工作正常,所以任何幫助表示讚賞。對不起,我的代碼的輸出 - 由於某種原因,它不希望正確格式化:

#import "MyOpenGLView.h" 


@implementation MyOpenGLView 

-(void)reshape { 
    NSRect rectView = [self bounds]; 
    if(m_rectView.size.width != rectView.size.width || m_rectView.size.height != rectView.size.height) { 
    glViewport(0, 0, rectView.size.width, rectView.size.height); 
    m_rectView = rectView; 
    } 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
} 

-(void) drawRect:(NSRect)bounds { 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f(1.0, 0.85, 0.35); 
    glBegin(GL_TRIANGLES); 
    { 
    glVertex3f(0.0, 0.6, 0.0); 
    glVertex3f(-0.2, -0.3, 0.0); 
    glVertex3f(0.2, -0.3, 0.0); 
    } 
    glEnd(); 
    glFlush(); 
} 
@end 

回答

2

你弄糊塗了幾件事情:OpenGL上下文沒有「開始」,則創建它。在MacOS X的情況下,只需實例化一個NSOpenGLView即可創建適當的上下文。

很多教程都做了一些工作,但從根本上說有缺陷的是將代碼設置投影和視口放在重塑處理程序中。 更清潔的解決方案是在顯示功能需要時設置所有狀態。這引起了我們最後的誤解,即人們認爲,一些OpenGL狀態只能設置一次。

gluOrtho2D不是OpenGL的一部分,它是GLU的一部分,GLU是一個非常舊的OpenGL輔助函數庫,對當今現代OpenGL實現很少使用。在gluOrtho2D的情況下,我永遠無法理解,爲什麼這個功能也沒有,因爲gluOrtho2D可以通過

void mygluOrtho2D(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top) 
{ 
    glOrtho(left, right, bottom, top, -1., 1.); 
} 

重新創建你看到它的只有兩個產生額外的參數。

+0

好吧,我在我的帖子中說過,我已經子類NSOpenGLView和綁定到我的課使用IB的視圖。我沒有包括我註釋掉的glOrtho代碼,但是我出於某種原因使最後2個參數0和0而不是-1.0和1.0。現在它似乎工作正常。我在重塑函數中使用它的原因是我試圖在我更新的glViewport中進行重繪,這當然是屏幕的寬度和高度。當我調整屏幕大小時,它似乎沒有正確更新以適應視口內部。 – usmsci 2011-06-06 21:33:44

+1

您應該在顯示處理程序中設置glViewport。調整大小處理程序應該設置一些實例變量(self.width,self.height)並觸發重新顯示。設置在==遠處會導致通過0進行一些除法,因此投影矩陣的某些元素變爲NaN。或者乾脆放在附近一定不能等於遠。 – datenwolf 2011-06-06 22:06:15

相關問題