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

Objective c 如何在OpenGLView中使用glClearBuffer*清除颜色缓冲区,objective-c,macos,cocoa,opengl,Objective C,Macos,Cocoa,Opengl,我试图了解如何在Cocoa for OS X中使用glClearBuffer*更改NSOpenGLView(单缓冲或双缓冲)中的背景颜色 OpenGL Superbible建议的以下代码片段因GL_无效_操作而失败: GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f}; glClearBufferfv(GL_COLOR, 0, red); 我需要为第二个参数提供什么 我正在使用一个扩展OpenGLView的双缓冲视图 #import "MyOpenGLView.h

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

OpenGL Superbible建议的以下代码片段因GL_无效_操作而失败:

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
#导入“MyOpenGLView.h”
#包括
@实现MyOpenGLView
-(void)drawRect:(NSRect)边界
{
GLfloat red[]={1.0f,0.0f,0.0f,1.0f};
glClearBufferfv(GL_颜色,0,红色);
GLenum e=glGetError();
//e==GL\u此调用后的无效\u操作
//视图是用黑色绘制的
//以下两条线路按预期工作:
//glClearColor(1.0,0.f,0.f,1.f);
//glClear(GLU颜色缓冲位);
[[self-openGLContext]flushBuffer];
}
@结束

真的吗?它给您提供了
GL\u无效\u操作

此函数不应生成该错误。。。您确定您的程序中早期的某些内容没有产生错误,并且您误认了错误源吗

然而,更大的问题是,在这个API调用中使用
GL\u COLOR
作为缓冲区,期望第二个参数成为绘制缓冲区集合的索引。不清楚在此代码中绘制缓冲区是如何设置的,可能您有
GL\u NONE
。由于在使用
GL\u NONE
时,如果试图清除绘图缓冲区,则没有定义的错误行为,因此我认为实现可能会选择引发
GL\u INVALID\u操作

为了使您当前对
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\u COLOR\u ATTACHMENT0
,如果您想清除
GL\u COLOR\u ATTACHMENT1
,您可以用
1
替换
0
,谢谢您的回答。glClearBufferfv确实给出了GL_INVALID_操作,glGetError在调用glClearBufferfv.Ah之前返回0,这很有趣。合理的假设是,当绘制缓冲区为
GL\u NONE
时,将导致无效操作。但是,官方OpenGL规范没有定义此行为-我必须向ARB发送一条关于此行为的消息。通过在awakeFromNib中更改NSOpenGLPixelFormat,将视图的核心配置文件显式设置为NSOpenGLProfileVersion3_2 core后,上述代码片段按预期工作。也许您想更新您的答案,以包括兼容性问题。在进一步挖掘之后,您能否澄清您的应用程序中是否有3.2+核心上下文?可以查询
GL\u版本
字符串的值<如果在兼容性(2.1)上下文中调用核心配置文件函数,则可以生成代码>GL\u无效\u操作。OS X在平台中是独一无二的,因为API函数都是静态链接的,因此您可以在2.1概要文件上下文中访问3.2函数(创建上下文后不加载函数);OSX通过发出
GL\u INVALID\u操作来处理这种情况,并且不做任何实际工作。是的,glGetString(GL\u版本)报告v2.1:所以我需要做的是将上下文更改为v3.2。谢谢