2013-10-24 21 views
0

我想了解如何使用glClearBuffer *改變一個(無論是單或雙緩衝)NSOpenGLView背景色可可爲OS X如何使用glClearBuffer *可可OpenGLView清除顏色緩存

由OpenGL的OpenGL超級提出下面的代碼片段失敗,GL_INVALID_OPERATION:

GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f}; 
glClearBufferfv(GL_COLOR, 0, red); 

我需要什麼,提供了第二個參數?

我正在使用雙緩衝視圖擴展OpenGLView。

#import "MyOpenGLView.h" 
#include <OpenGL/gl3.h> 

@implementation MyOpenGLView 


-(void) drawRect: (NSRect) bounds 
{ 

    GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f}; 
    glClearBufferfv(GL_COLOR, 0, red); 

    GLenum e = glGetError(); 

    // e == GL_INVALID_OPERATION after this call 
    // and the view is drawn in black 

    // The following two lines work as intended: 
    //glClearColor(1.0, 0.f, 0.f, 1.f); 
    //glClear(GL_COLOR_BUFFER_BIT); 

    [[self openGLContext] flushBuffer]; 
} 

@end 
+1

經過一番進一步的挖掘,您能否澄清您的應用程序中是否有3.2+核心環境?也許查詢'GL_VERSION'字符串的值。如果您在兼容性(2.1)上下文中調用核心配置文件函數,則可以生成「GL_INVALID_OPERATION」。 OS X在平臺中是獨一無二的,因爲API函數都是靜態鏈接的,因此您可以在2.1配置文件上下文中訪問3.2函數(在創建上下文之後,您不會加載函數***)。 OS X通過發出「GL_INVALID_OPERATION」來處理這種情況,並沒有做任何實際的工作。 –

+0

是的,glGetString(GL_VERSION)報告v2.1:所以我需要做的是將上下文更改爲v3.2。謝謝! –

回答

2

真的嗎?它給你GL_INVALID_OPEARATION

這個函數不應該產生這個錯誤......你確定在你的程序的早些時候沒有創建錯誤,你錯誤的來源?

但是,更大的問題是,使用GL_COLOR作爲此API調用中的緩衝區,期望第二個參數成爲您的繪圖緩衝區組中的索引。目前還不清楚如何在此代碼中設置繪圖緩衝區,您可能有GL_NONE。由於在使用GL_NONE時如果嘗試清除繪圖緩衝區時沒有定義的錯誤行爲,我想實現可能會選擇提高GL_INVALID_OPERATION

爲了讓您當前的glClearBufferfv (...)使用纔有意義,我希望看到這樣的事情:

GLenum buffers [] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; 
GLfloat red  [] = { 1.0f, 0.0f, 0.0f, 1.0f }; 

glDrawBuffers (2, buffers); 
glClearBufferfv (GL_COLOR, 0, red); 

現在,這個電話將清除GL_COLOR_ATTACHMENT0,如果你想清楚GL_COLOR_ATTACHMENT1,你可以取代01

+0

感謝您的回答。 glClearBufferfv的確給GL_INVALID_OPERATION,glGetError在glClearBufferfv調用之前返回0。 –

+0

啊,這很有趣。當你的繪圖緩衝區是GL_NONE時,就會導致**無效操作**,這是合乎邏輯的。然而,官方的OpenGL規範沒有定義這種行爲 - 我必須向ARB發送一條消息。 –

+1

通過更改awakeFromNib中的NSOpenGLPixelFormat將視圖的核心配置文件顯式設置爲NSOpenGLProfileVersion3_2Core之後,上面的代碼片段按預期工作。也許你想更新你的答案,以包括兼容性問題。 –