Objective c 如何在OpenGLView中使用glClearBuffer*清除颜色缓冲区
我试图了解如何在Cocoa for OS X中使用glClearBuffer*更改NSOpenGLView(单缓冲或双缓冲)中的背景颜色 OpenGL Superbible建议的以下代码片段因GL_无效_操作而失败: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
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。谢谢