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를 사용합니다. 선에 color 속성을 적용하자마자 텍스쳐는 모두 선과 같은 색으로 채색됩니다.

편집 : 문제의 일부는 위의 마지막 줄에 glDrawArrays 후

glDisableVertexAttribArray(GLKVertexAttribColor); 

을 사용하여 해결 될 것으로 보인다.

내 텍스처가 더 이상 선과 같은 색상으로 표시되지 않지만 이제는 흰색 직사각형으로 표시됩니다. 이는 실제로 개선되지 않습니다.

또한 'self.effect.texture2d0.enabled = YES'및 'self.effect.texture2d0.enabled = NO'를 주석 처리하면 텍스처가 제대로 표시되지만 줄이 검은 색으로 표시됩니다. 녹색).

편집 II : 실제로 찾고있는 것은 한 블록 (선 그리기)의 텍스처를 해제 한 다음 다시 삼각형을 그리기 위해 다시 전환하는 것입니다. 그리고 잘못된 것은 self.effect.texture2d0.enabled가 그려지는 모든 것에 대한 상태를 설정한다는 것입니다.

답변

0

self.effect.texture2d0.enabled = TRUE/FALSE는 실제로 preparetodraw 블록의 모든 상태를 설정하므로 해결 방법은 두 개의 preparetodraw를 사용하는 것입니다.

번째 블록 :

[EAGLContext setCurrentContext : self.context];

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); 
:
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); 

번째 블록 얹는