2014-05-08 4 views
1

Моя цель - нарисовать текстуры и нарисовать цветную линию сверху в GlKViewController. Обе части работают индивидуально, но когда я совмещаю их в одну и ту же функцию рисования, я теряю текстуры - они окрашены в тот же цвет, что и линия.Конфликт между рисованием как текстур, так и линий с цветами в GLKit

В моем розыгрыше

ме-

Во-первых, код для моих текстурированных треугольников:

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

    [EAGLContext setCurrentContext:self.context]; 

    [self.effect prepareToDraw]; 

    self.effect.texture2d0.enabled = YES; 


    glClearColor(0.5, 0.5, 0.5, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glEnable(GL_BLEND); 

    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 


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

    glDrawElements(GL_TRIANGLES, nLiveSquares*6, GL_UNSIGNED_SHORT, 0); 

Далее следуют код для моих строк:

self.effect.texture2d0.enabled = NO; 
glDisable(GL_BLEND); 

glBindBuffer(GL_ARRAY_BUFFER, _lineBuffer); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition,2,GL_FLOAT,GL_FALSE,sizeof(LinePoint),(const GLvoid *) offsetof(LinePoint, Position)); 

glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor,4,GL_FLOAT,GL_FALSE,sizeof(LinePoint),(const GLvoid *) offsetof(LinePoint, Color)); 

// Set the line width 
glLineWidth(50.0); 

// Render the line 

glDrawArrays(GL_LINE_STRIP, 0, 2); 

Проблема, кажется, возникают используя GLKVertexAttribColor. Как только я применил атрибут цвета к строкам, все текстуры также окрашены в тот же цвет, что и линии.

Edit: Часть этой проблемы может быть решена с помощью

glDisableVertexAttribArray(GLKVertexAttribColor); 

после glDrawArrays на последней строке выше.

Мои текстуры больше не имеют цвета того же цвета, что и линия, но теперь они отображаются как белые прямоугольники, что на самом деле не является улучшением.

Кроме того, если я прокомментирую «self.effect.texture2d0.enabled = YES» и «self.effect.texture2d0.enabled = NO», тогда мои текстуры будут правильно отображаться, но моя строка станет черной (когда она должна быть зеленого цвета).

Редактирование II: Я думаю, что я действительно ищу, это способ отключить текстуры для одного блока (линии рисования), а затем снова включить их для рисования треугольников. И я думаю, что не так, что self.effect.texture2d0.enabled устанавливает состояние для всего, что нарисовано.

ответ

0

self.effect.texture2d0.enabled = TRUE/FALSE действительно устанавливает состояние для всего в блоке preparetodraw, поэтому решение заключалось в использовании двух readytodraw.

Первый блок:

[EAGLContext setCurrentContext: self.context];

self.effect.texture2d0.enabled = YES; 
[self.effect prepareToDraw]; 



glClearColor(0.5, 0.5, 0.5, 1.0); 
glClear(GL_COLOR_BUFFER_BIT); 

glEnable(GL_BLEND); 

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 


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

glDrawElements(GL_TRIANGLES, nLiveSquares*6, GL_UNSIGNED_SHORT, 0); 

Вслед за вторым блоком:

self.effect.texture2d0.enabled = NO; 
[self.effect prepareToDraw]; 

glDisable(GL_BLEND); 

glBindBuffer(GL_ARRAY_BUFFER, _lineBuffer); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition,2,GL_FLOAT,GL_FALSE,sizeof(LinePoint),(const GLvoid *) offsetof(LinePoint, Position)); 

glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor,4,GL_FLOAT,GL_FALSE,sizeof(LinePoint),(const GLvoid *) offsetof(LinePoint, Color)); 

// Set the line width 
glLineWidth(50.0); 

// Render the line 

glDrawArrays(GL_LINE_STRIP, 0, 2);