2013-07-13 45 views
0

我正在使用IOS 6.1,试图绘制纹理和顶点缓冲区对象。Vertex缓冲区对象干扰OpenGL ES 2.0中的纹理

我设置这样的结构:

typedef struct{ 
    CGPoint geometryVertex; 
    CGPoint textureVertex; 
} TexturedVertex; 

typedef struct { 
    TexturedVertex bl; 
    TexturedVertex br; 
    TexturedVertex tl; 
    TexturedVertex tr; 
} TexturedQuad; 

NSError   *error; 
NSString  *path = [[NSBundle mainBundle] pathForResource:@"img.png" ofType:nil]; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], GLKTextureLoaderOriginBottomLeft, nil]; 
self.textureInfo = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error]; 
TexturedQuad quad; 
quad.bl.geometryVertex = CGPointMake(0, 0); 
quad.br.geometryVertex = CGPointMake(self.textureInfo.width, 0); 
quad.tl.geometryVertex = CGPointMake(0, self.textureInfo.height); 
quad.tr.geometryVertex = CGPointMake(self.textureInfo.width, self.textureInfo.height); 
quad.bl.textureVertex = CGPointMake(0, 0); 
quad.br.textureVertex = CGPointMake(1, 0); 
quad.tl.textureVertex = CGPointMake(0, 1); 
quad.tr.textureVertex = CGPointMake(1, 1); 
self.quad = quad; 

glClearColor(0, 0, 0, 0.5); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 

然后得出这样的:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    self.baseEffect.texture2d0.name = self.textureInfo.name; 
    self.baseEffect.transform.modelviewMatrix = [self modelMatrix]; 
    [self.baseEffect prepareToDraw]; 

    long offset = (long)&_quad; 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *)(offset + offsetof(TexturedVertex, geometryVertex))); 
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *)(offset + offsetof(TexturedVertex, textureVertex))); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
} 

这一切的作品,没有任何问题。然而,我想要做的下一步,是绘制另一个对象存储在不是纹理的顶点缓冲区对象中。因此,我将其添加到设置代码中:

typedef struct { 
    float Position[3]; 
} Vertex; 

const Vertex Vertices[] = { 
    {100, -100, 0}, 
    {100, 100, 0}, 
    {-100, 100, 0}, 
    {-100, -100, 0} 
}; 

GLuint _vertexBuffer; 

glGenBuffers(1, &_vertexBuffer); // (1) 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); // (2) 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); // (3) 

但即使没有试图绘制新对象,这些行会使我的应用程序崩溃。我发现只用行(1)它不会崩溃。使用(1)+(2)它仍然不会崩溃,但使用Instruments进行分析会告诉我纹理“超出阵列缓冲区边界”的绘制调用,并使用“未初始化的缓冲区数据”,尽管它仍然能够很好地绘制纹理。添加第(3)行导致应用程序崩溃,仪器告诉我没有GL数据。

有谁知道为什么会发生这种情况?

回答

0

VBO显然干扰了对glVertexAttribPointer的调用。解除绑定它像这样停止了崩溃:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    self.baseEffect.texture2d0.name = self.textureInfo.name; 
    self.baseEffect.transform.modelviewMatrix = [self modelMatrix]; 
    [self.baseEffect prepareToDraw]; 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    long offset = (long)&_quad; 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *)(offset + offsetof(TexturedVertex, geometryVertex))); 
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *)(offset + offsetof(TexturedVertex, textureVertex))); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
} 

,因为它是不使用VBO所以不应该有一个当glVertexAttribPointer调用时绑定的质感。