我正在尝试了解如何使用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
答案 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
。