Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Iphone 添加顶点时OpenGl崩溃_Iphone_Objective C_Opengl Es_Vertex Buffer - Fatal编程技术网

Iphone 添加顶点时OpenGl崩溃

Iphone 添加顶点时OpenGl崩溃,iphone,objective-c,opengl-es,vertex-buffer,Iphone,Objective C,Opengl Es,Vertex Buffer,每当我向顶点数组添加顶点时,我的应用程序就会崩溃 代码如下: const GLKVector3 Vertices[] = { //8,9,0 LASH_BOTTOM_LEFT, LASH_BOTTOM_RIGHT, RECT_BOTTOM_L, //9,1,0 LASH_BOTTOM_RIGHT, RECT_BOTTOM_R, RECT_BOTTOM_L, //2,6,7 RECT_TOP_R, LASH_TOP_RIGHT, LASH_TOP_LEFT, //3,2,7 RECT

每当我向顶点数组添加顶点时,我的应用程序就会崩溃

代码如下:

const GLKVector3 Vertices[] = {


//8,9,0
LASH_BOTTOM_LEFT,
LASH_BOTTOM_RIGHT,
RECT_BOTTOM_L,


//9,1,0
LASH_BOTTOM_RIGHT,
RECT_BOTTOM_R,
RECT_BOTTOM_L,


//2,6,7
RECT_TOP_R,
LASH_TOP_RIGHT,
LASH_TOP_LEFT,

//3,2,7
RECT_TOP_L,
RECT_TOP_R,
LASH_TOP_LEFT,

//0,1,3
RECT_BOTTOM_L,
RECT_BOTTOM_R,
RECT_TOP_L,

//1,2,3
RECT_BOTTOM_R,
RECT_TOP_R,
RECT_TOP_L,

//2,5,3
RECT_TOP_R,
BACK_RIGHT,
RECT_TOP_L,

//3,5,4
RECT_TOP_L,
BACK_RIGHT,
BACK_LEFT,


//0,1,5
RECT_BOTTOM_L,
RECT_BOTTOM_R,
BACK_RIGHT,

//5,4,0
BACK_RIGHT,
BACK_LEFT,
RECT_BOTTOM_L,


};
设置它:

- (void)setupGL {


    [EAGLContext setCurrentContext:self.myContext];

    self.effect = [[GLKBaseEffect alloc] init];
    self.layer.contentsScale = 2.0;

    // Create default framebuffer object.
    glGenFramebuffers(1, &defaultFrameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFrameBuffer);


    ViewToMap *view = [[ViewToMap alloc]initWithFrame:CGRectMake(0, 0, 320, 80)];
    view.layer.shadowOffset = CGSizeMake(1, 1);
    view.layer.masksToBounds = NO;
    view.layer.shadowRadius = 1;
    view.layer.shadowOpacity = 0.02;

    GLfloat coordToPixScale = 1.0;//[UIScreen mainScreen].scale;


    /*********************
     MAPPING UIVIEW ONTO THE FACE
     ****************/

    self.effect.texture2d0.enabled = true;



    // make space for an RGBA image of the view
    GLubyte *pixelBuffer = (GLubyte *)malloc(
                                             4 *
                                             view.bounds.size.width * coordToPixScale *
                                             view.bounds.size.height * coordToPixScale);

    // create a suitable CoreGraphics context
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context =
    CGBitmapContextCreate(pixelBuffer,
                          view.bounds.size.width*coordToPixScale, view.bounds.size.height*coordToPixScale,
                          8, 4*view.bounds.size.width *coordToPixScale,
                          colourSpace,
                          kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colourSpace);

    // draw the view to the buffer
    [view.layer renderInContext:context];

    // upload to OpenGL
    glTexImage2D(GL_TEXTURE_2D, 0,
                 GL_RGBA,
                 view.bounds.size.width * coordToPixScale, view.bounds.size.height * coordToPixScale, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);

    BOOL repeatX = NO;
    BOOL repeatY = NO;

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeatX ? GL_REPEAT
                    : GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeatY ? GL_REPEAT
                    : GL_CLAMP_TO_EDGE);



    glGenBuffers(1, &texArray);
    glBindBuffer(GL_ARRAY_BUFFER, texArray);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glBufferData(GL_ARRAY_BUFFER, sizeof(TexCoords), TexCoords, GL_STATIC_DRAW);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0,0);

    /**************************
     ******************************************/

    // clean up
    CGContextRelease(context);
    free(pixelBuffer);

    glGenRenderbuffers(1, &depthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, view.bounds.size.width * coordToPixScale, view.bounds.size.height * coordToPixScale);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

    glEnable(GL_DEPTH_TEST);

    glGenBuffers(1, &vertexArray);
    glBindBuffer(GL_ARRAY_BUFFER, vertexArray);
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,0,0);



    self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(45.0f,0.9f, 0.01f, 1.0f);

    rotMatrix = GLKMatrix4Translate(self.effect.transform.modelviewMatrix,0,0,-2);
    self.effect.transform.projectionMatrix =          GLKMatrix4Translate(self.effect.transform.projectionMatrix, 0, 0, 1.2);


}
如果我再添加一个顶点,一切看起来都正常,但是如果我添加另一个顶点,它就会崩溃(不管它们的坐标是什么,我认为顶点坐标完全正常)

我得到的是一个糟糕的访问错误

抽签通知:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {


    self.opaque = NO;

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    [self.effect prepareToDraw];

    glDrawArrays(GL_TRIANGLES, 0, sizeof(Vertices));
}

好吧,我对此有预感,但在你的情况下,涉及到驱动程序有问题(我可以解释崩溃,即程序突然终止),只涉及有问题的驱动程序

添加顶点位置会破坏代码,这并不奇怪。顶点是位置、纹理坐标和其他属性的整个元组。因此,在添加位置时,还必须添加其他属性。如果您使用的是客户端顶点数组,这可以解释崩溃的原因,但是VBO应该能够捕捉到这一点

无论如何,您有这些调用(对它们进行注释)

你必须确保

buf_size_t / (attrib_elements_t * sizeof(GLfloat)) 

    ==

buf_size_p / (attrib_elements_p * sizeof(GLfloat))
如果这种平等得不到满足,事情就会以某种形式破裂

由于问题编辑而更新 最后是问题的根源:

 glDrawArrays(GL_TRIANGLES, 0, sizeof(Vertices));
                               ^^^^^^
                                     \--- This
glDrawArrays需要绘制的顶点数(而不是顶点数组缓冲区的大小)


sizeof
操作符不会告诉您数组中的顶点数,而是以
char
为单位显示其大小。您必须将其替换为
sizeof(顶点)/(sizeof(GLfloat)*attrib_elements_p)
attrib_elements_p=3

如果将对glBufferData的调用放在相应的glVertexAttribPointer调用之前,会发生什么情况?谢谢您的回答。不,它不会改变任何东西。最好把代码放在问题中。我认为缓冲区可能无法存储更多的顶点,所以我认为这是一个基本问题。你声称是重复的问题我详细阐述了,因为我确信还有更多。@MartinE:问题是,在另一个问题的代码中,它没有显示,你是如何添加顶点的。所以很难做出一个好的答案。如果我理解正确,顶点必须有相应的纹理坐标,对吗?我总是确保同时添加它们,但它仍然崩溃…@MartinE:请理解顶点不是位置。顶点是位置+纹理坐标+法线+使用的任何其他属性。顶点甚至可能根本不是位置,而是由顶点着色器转换为位置的其他变量。无论如何,是的,您必须始终提供整个集合(或指定attibute绑定因子)。然而,这很奇怪。嗯,我必须看整个节目才能理解它。嗯,这几乎就是整个节目。我没有改变任何东西,只是在顶点数组中添加了一个顶点,并添加了相应的纹理坐标。我总是以同样的方式进行操作,其余的代码总是保持不变。@MartinE.:我没有看到绘图调用(glDraw…)@MartinE.:glDrawArrays需要渲染的顶点数。但是
sizeof(顶点)
返回数组在
char
s内存中的大小。单个GLfloat的大小为4个字符(在某些系统上甚至更大)。每个顶点位置有3个元素,因此
sizeof(顶点)
返回实际期望值的3*4=12倍。
buf_size_t / (attrib_elements_t * sizeof(GLfloat)) 

    ==

buf_size_p / (attrib_elements_p * sizeof(GLfloat))
 glDrawArrays(GL_TRIANGLES, 0, sizeof(Vertices));
                               ^^^^^^
                                     \--- This