【问题标题】:Problem with getting simple VBO to work on Mac让简单的 VBO 在 Mac 上工作的问题
【发布时间】:2011-06-11 18:25:48
【问题描述】:

我正在尝试修改 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) 应该做的那样。

【问题讨论】:

    标签: cocoa opengl


    【解决方案1】:

    让我们从基础开始:

    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”函数中,我猜您有更大的问题。

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

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

    【讨论】:

    • 好的,谢谢,我将东西的 sizeof 更改为 2*,它工作了。不过附带说明一下:我打算将 init 的东西放在我的类的 init 方法中,但是像 glClear() 或 glClearColor 这样简单的东西在 init 方法中不起作用,所以我把它移到了 drawRect 中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2020-02-22
    相关资源
    最近更新 更多