让简单的VBO在Mac上运行的问题

时间:2011-06-10 20:44:36

标签: cocoa opengl

我正在尝试重新编写accepted answer of this question以在Cocoa应用程序中工作。

我创建了一个名为OpenGLView的类,它是NSOpenGLView的子类,在我的Xib文件中,我有一个带有自定义类OpenGLView的OpenGL视图。

我已经使我的OpenGLView类实现如下:

#import "OpenGLView.h"
#include <OpenGL/OpenGL.h>
#include <OpenCL/OpenCL.h>

@implementation OpenGLView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (void)drawRect:(NSRect)dirtyRect
{    
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glShadeModel(GL_FLAT);
    glEnableClientState(GL_VERTEX_ARRAY);
    float data[][2] = {{50,50},{100,50},{75,100}};
    glGenBuffers(1,&ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f,0.0f,0.0f);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glVertexPointer(3, GL_FLOAT, 3*sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES,0,3);
    glFlush(); 

}

@end

基本上,(glewInit()除外)我复制了init方法,并在display()方法中复制并粘贴了-(void)drawRect函数内容。当我运行程序时,我没有错误或警告,没有运行时错误,但我只得到一个没有三角形的黑屏。但是,有一个白色屏幕,glClear(GL_COLOR_BUFFER_BIT)应该这样做。

1 个答案:

答案 0 :(得分:3)

让我们从基础知识开始:

float data[][2] = {{50,50},{100,50},{75,100}};

这是一个包含3个浮点数的数组。因此每个顶点位置包含2个浮点数。有3个顶点,总共6个浮点数。

glVertexPointer(3, GL_FLOAT, 3*sizeof(float), 0);

你告诉OpenGL你给它每个顶点3个浮点数(前3个)。你在缓冲区对象中放了6个浮点数。由于您渲染单个三角形,因此需要3个顶点,这意味着OpenGL将尝试读取 9个浮点数。

事实上,你似乎已经以某种方式复制了这个错误,因为原始数据是正确的,对于数据:

glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);

现在,这可能不是您的代码唯一的错误,因为您没有发布您链接到的答案中使用的初始化例程。考虑到你把答案的“init”函数中的代码放到你的“dirtyRect”函数中,我猜你有更大的问题。

答案分开“初始化”和“显示”是有原因的。因为有些事情是初始化(缓冲区对象的创建和各种状态的设置),而其他事情是你每次都做的事情(清除缓冲区,设置指针和glDrawArrays)。

您应该找到一种方法来保持代码中初始化与更新的分离。