2014-03-13 2 views
0

Я создаю прямоугольник в OpenGL ES 2.0, используя GLKit. Это работает, и я могу заполнить прямоугольник сплошным цветом и градиентом.GLKit, авария в визуализации текстур

Теперь я пытаюсь заполнить его текстурой с изображения, которое не работает для меня.

Я получаю сообщение об ошибке EXC_BAD_ACCESS = 1 в строке glDrawElements.

Вот что я прямо сейчас:

// Установка GKLView

EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; self.glkView = [[GLKView alloc] initWithFrame:self.bounds context:context]; _glkView.opaque = NO; _glkView.backgroundColor = [UIColor clearColor]; _glkView.delegate = self; [self addSubview:_glkView];

// Установка BaseEffect

self.effect = [[GLKBaseEffect alloc] init]; [EAGLContext setCurrentContext:_glkView.context]; GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, self.bounds.size.width, 0, self.bounds.size.height, 0.0, 1.0); self.effect.transform.projectionMatrix = projectionMatrix; GLKMatrix4 modelMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0.0, 0.0, -0.1); self.effect.transform.modelviewMatrix = modelMatrix;

// Загрузка изображения

UIImage* image = ... CGImageRef cgImage = image.CGImage; NSError* error; self.textureInfo = [GLKTextureLoader textureWithCGImage:cgImage options:nil error:&error]; if (error) { NSLog(@"could not load texture"); } if (_textureInfo) { self.effect.texture2d0.envMode = GLKTextureEnvModeReplace; self.effect.texture2d0.target = GLKTextureTarget2D; self.effect.texture2d0.name = _textureInfo.name; } // Bind буферы

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glGenBuffers(1, &_indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer (GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position)); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, _currentData.texCoordinates);

// заселить буферы

glBufferData(GL_ARRAY_BUFFER, (sizeof(Vertex) * _currentData.numberOfVertices), _currentData.vertices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, (sizeof(GLubyte) * _currentData.numberOfIndices), _currentData.indices, GL_STATIC_DRAW);

[self.effect prepareToDraw]; [self.glkView display];

// Внутри - (Недействительными) glkView: (GLKView *) вид drawInRect: (CGRect) Rect; glDrawElements(GL_TRIANGLE_STRIP, (sizeof(GLubyte) * _currentData.numberOfIndices), GL_UNSIGNED_BYTE, 0);

Данные для текстурных координат:

SimpleVertex* vertices1 = (SimpleVertex *)malloc(sizeof(SimpleVertex) * 4); 
    vertices1[0].Position[0] = 0.0; 
    vertices1[0].Position[1] = 0.0; 

    vertices1[1].Position[0] = 0.0; 
    vertices1[1].Position[1] = 1.0; 

    vertices1[2].Position[0] = 1.0; 
    vertices1[2].Position[1] = 1.0; 

    vertices1[3].Position[0] = 1.0; 
    vertices1[3].Position[1] = 0.0; 

typedef struct 
{ 
    GLfloat Position[2]; 
} 
SimpleVertex; 

Как я уже сказал, я уверен, что прямоугольник втягивается правильно. Я могу проверить это, заполнив его градиентом, это выглядит хорошо. Также загрузчик текстур загружает изображение правильно, я могу проверить это в отладчике.

Может кто-нибудь указать, что я пропал без вести или здесь не так?

ответ

0

Хорошо, я понял. Ошибка заключалась в том, что я передавал текстуру координирующую информацию в openGL. Я проезжал данные для вершин и цвета таким образом:

glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer (GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));

Но координаты текстуры я создал отдельную структуру и передавая указатель на эти данные, а не смещение уже связанный массив вершин:

glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, _currentData.texCoordinates);

раствор затем, очевидно, включать данные в пределах структуры данных Vertex, а затем дать смещение следующим образом:

glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));

Я по-прежнему новичок в OpenGL ES, поэтому, возможно, был лучший способ решить эту проблему, но это сработало для меня.