我正在尝试修改 accepted answer of this question在 Cocoa 应用程序中工作。
我创建了一个名为 OpenGLView 的类,它是 NSOpenGLView 的子类,在我的 Xib 文件中,我有一个带有 OpenGLView 自定义类的 OpenGL View 。
我的 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)
应该做的那样。
最佳答案
让我们从基础知识开始:
float data[][2] = {{50,50},{100,50},{75,100}};
这是一个由 3 对 float 组成的数组。所以每个顶点位置包含2个 float 。有 3 个顶点,总共有 6 个 float 。
glVertexPointer(3, GL_FLOAT, 3*sizeof(float), 0);
你告诉 OpenGL 你给每个顶点 3 个 float (前 3 个)。您将 6 个 float 放入缓冲区对象中。由于您要渲染单个三角形,因此需要 3 个顶点,这意味着 OpenGL 将尝试读取九个 个 float 。
确实,您似乎以某种方式复制了这个错误,因为原始数据是正确的:
glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
现在,这可能不是您的代码的唯一问题,因为您没有发布链接到的答案中使用的初始化例程。考虑到您将答案的“init”函数中的代码放入“dirtyRect”函数中,我猜您有更大的问题。
答案有单独的“init”和“display”是有原因的。因为有些事情是初始化(缓冲区对象的创建和各种状态的设置),而其他事情是你每次都要做的事情(清除缓冲区,设置指针和glDrawArrays)。
您应该找到一种方法来保持代码中初始化与更新的分离。
关于cocoa - 让简单的 VBO 在 Mac 上运行时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311866/