0

我试图了解如何使用 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);

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

我正在使用扩展 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
4

1 回答 1

2

真的吗?它给你GL_INVALID_OPEARATION

这个函数不应该产生那个错误......你确定你的程序前面的东西没有产生错误并且你弄错了来源吗?

然而,更大的问题是,GL_COLOR在此 API 调用中用作缓冲区需要第二个参数是您的绘图缓冲区集的索引。目前尚不清楚您的绘图缓冲区是如何在此代码中设置的,您可能有GL_NONE. 如果您在GL_NONE使用时尝试清除绘图缓冲区,则没有定义的错误行为,我想实现可能会选择 raise 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.

于 2013-10-24T21:10:47.000 回答