Cocoa 让简单的VBO在Mac上工作的问题
我正在尝试重新编写Cocoa应用程序 我创建了一个名为OpenGLView的类,它是NSOpenGLView的一个子类,在我的Xib文件中,我有一个OpenGL视图和一个自定义的OpenGLView类 我的OpenGLView类实现如下所示:Cocoa 让简单的VBO在Mac上工作的问题,cocoa,opengl,Cocoa,Opengl,我正在尝试重新编写Cocoa应用程序 我创建了一个名为OpenGLView的类,它是NSOpenGLView的一个子类,在我的Xib文件中,我有一个OpenGL视图和一个自定义的OpenGLView类 我的OpenGLView类实现如下所示: #import "OpenGLView.h" #include <OpenGL/OpenGL.h> #include <OpenCL/OpenCL.h> @implementation OpenGLView - (id)init
#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
#导入“OpenGLView.h”
#包括
#包括
@OpenGLView的实现
-(id)initWithFrame:(NSRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
}
回归自我;
}
-(无效)解除锁定
{
[super dealoc];
}
-(void)drawRect:(NSRect)dirtyRect
{
glClearColor(1.0f、1.0f、1.0f、0.0f);
glShadeModel(GLU平面);
glEnableClientState(GL_顶点_数组);
浮点数据[][2]={{50,50},{100,50},{75100};
glGenBuffers(1,&ID);
glBindBuffer(GL_数组_BUFFER,ID);
glBufferData(GLU数组缓冲区、大小(数据)、数据、GLU静态图);
glClear(GLU颜色缓冲位);
GL3F(0.0f,0.0f,0.0f);
glBindBuffer(GL_数组_BUFFER,ID);
glvertexointer(3,GL_浮点,3*sizeof(浮点),0);
GLDRAW阵列(GLU三角形,0,3);
glFlush();
}
@结束
基本上,(除了
glewInit()
)我复制了init方法,并将display()
函数内容复制并粘贴到-(void)drawRect
方法中。当我运行程序时,我没有得到错误或警告,没有运行时错误,但我只得到一个没有三角形的黑屏。但是,有一个白色屏幕,glClear(GL\u COLOR\u BUFFER\u BIT)
应该这样做。让我们从基本内容开始:
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”是有原因的。因为有些事情是初始化(创建缓冲区对象和设置各种状态),而有些事情是每次都要做的事情(清除缓冲区、设置指针和数组)
您应该找到一种方法来保持代码中初始化和更新的分离。好的,谢谢,我将thing的大小更改为2*并且成功了。不过还有一点需要注意:我本来打算将init内容放在类的init方法中,但是像glClear()或glClearColor这样的简单内容在init方法中不起作用,所以我将其移动到了drawRect。谢谢