Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 让简单的VBO在Mac上工作的问题_Cocoa_Opengl - Fatal编程技术网

Cocoa 让简单的VBO在Mac上工作的问题

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

我正在尝试重新编写Cocoa应用程序

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

我的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
#导入“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。谢谢