Open GL - ES 2.0: объект с несколькими вершинными буферами - PullRequest
1 голос
/ 09 февраля 2012

У меня был быстрый вопрос по openGL ES 2.0. Я пытаюсь создать на экране несколько рисунков, которые потребуют нескольких геометрий. Вот как я создаю геометрию.

(void)setupBoxGeometry{

   GLuint vertexBuffer;
   glGenBuffers(1, &vertexBuffer);
   glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
   glBufferData(GL_ARRAY_BUFFER, sizeof(BoxVertices), BoxVertices, GL_STATIC_DRAW);

   GLuint indexBuffer;
   glGenBuffers(1, &indexBuffer);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(BoxIndices), BoxIndices, GL_STATIC_DRAW);
}

- (void)setupLineGeometry{

   GLuint vertexBuffer;
   glGenBuffers(1, &vertexBuffer);
   glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
   glBufferData(GL_ARRAY_BUFFER, sizeof(LineVertices), LineVertices, GL_STATIC_DRAW);

   GLuint indexBuffer;
   glGenBuffers(1, &indexBuffer);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(LineIndices), LineIndices, GL_STATIC_DRAW);
}

Это моя функция рендеринга

- (void)render:(CADisplayLink*)displayLink {
   glClearColor(0.0/255.0, 0.0/255.0, 0.0/255.0, 1.0);
   glClear(GL_COLOR_BUFFER_BIT);

   float h = 4.0f * self.frame.size.height / self.frame.size.width;
   glViewport(0, 0, self.frame.size.width, self.frame.size.height);

   glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 
                      sizeof(Vertex), 0);
   glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 
                      sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));


   // Do some thing to the projection    
   CC3GLMatrix *projection = [CC3GLMatrix matrix];    
   [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:10];
   glUniformMatrix4fv(_projectionUniform, 1, 0, projection.glMatrix);


   // Create the base for the square to be drawn on the screen    
   _baseMatrix = [CC3GLMatrix matrix];


   [_baseMatrix populateFromTranslation:CC3VectorMake(-3.0, -5.2 + _yIncrease, -10)];    
   [_baseMatrix scaleByX:0.5];
   [_baseMatrix scaleByY:_yIncrease];
   [_baseMatrix rotateBy:CC3VectorMake(0, _rotationAngle, 0)];
   glUniformMatrix4fv(_modelViewUniform, 1, 0, _baseMatrix.glMatrix);
   glDrawElements(GL_TRIANGLES, sizeof(BoxIndices)/sizeof(BoxIndices[0]), 
               GL_UNSIGNED_BYTE, 0);
}

Я вызываю функцию геометрии ящика перед вызовом функции геометрии линии. Проблема в том, что теперь моя функция рендеринга рисует только линии. Он не рисует никаких коробок. Что я делаю неправильно. Если вопрос не ясен, я могу дать больше разъяснений /

1 Ответ

3 голосов
/ 09 февраля 2012

Где вы привязываете буферы перед рисованием? Звоните

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);

до

glVertexAttribPointer(...);

И звоните

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

до

glDrawElements(...);

Также вам нужно включить указатели вершин, которые вы используете:

glEnableVertexAttribArray(_positionSlot);
glEnableVertexAttribArray(_colorSlot);
...