如何在Cocoa OpenGLView中使用glClearBuffer *来清除颜色缓冲区

时间:2013-10-24 20:56:02

标签: objective-c macos cocoa opengl

我正在尝试了解如何使用glClearBuffer *来改变Cocoa for OS X中的(单缓冲或双缓冲)NSOpenGLView中的背景颜色。

OpenGL Superbible建议的以下代码片段因GL_INVALID_OPERATION而失败:

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

我需要为第二个参数提供什么?

我正在使用双缓冲View扩展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 个答案:

答案 0 :(得分:2)

真的?它给你GL_INVALID_OPEARATION

这个函数不应该生成那个错误......你确定程序中较早的东西没有产生错误并且你误解了源代码吗?

然而,更大的问题是在此API调用中使用GL_COLOR作为缓冲区需要第二个参数作为绘制缓冲区集的索引。目前还不清楚如何在此代码中设置绘制缓冲区,您可能有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,则可以将0替换为1