I am using IOS 6.1, trying to draw a texture and a vertex buffer object.
I setup a texture like this:
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);
Then draw it like this:
- (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);
}
That all works, no problem. What I want to do next though is draw another object stored in a vertex buffer object that isn't a texture. So I add this to the setup code:
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)
But even without trying to draw the new object, those lines crash my app. I have found that with just line (1) it doesn't crash. With (1) + (2) it still doesn't crash but profiling with Instruments tells me the draw call for the texture 'Exceeded array buffer bounds' and used 'Uninitialized buffer data', although it still draws the texture just fine. Adding line (3) causes the app to crash and Instruments to tell me there is no GL data.
Does anyone know why this is happening?