2013-04-30 71 views
0

我想批一堆矩形/四邊形,並得到了一些奇怪的混合:配料四邊形產生不良顏色混合的OpenGL ES2

enter image description here

每個矩形似乎得到了鄰居的顏色一點點。

這裏是我的測試代碼:

typedef struct { 
Vertex bl; 
Vertex br; 
Vertex tl; 
Vertex tr; 
} TexturedQuad; 

typedef struct { 
CGPoint geometryVertex; 
} Vertex; 

...

- (void)setupTextureQuad { 
self.quads = [NSMutableArray arrayWithCapacity:1]; 

for (int i = 0; i < 10; i++) { 
    TexturedQuad newQuad; 

    newQuad.bl.geometryVertex = CGPointMake(i * self.contentSize.width, 0.); 
    newQuad.br.geometryVertex = CGPointMake(self.contentSize.width + (i * self.contentSize.width), 0.); 
    newQuad.tl.geometryVertex = CGPointMake(i * self.contentSize.width, self.contentSize.height); 
    newQuad.tr.geometryVertex = CGPointMake(self.contentSize.width + (i * self.contentSize.width), self.contentSize.height); 

    [self.quads addObject:[NSValue value:&newQuad withObjCType:@encode(TexturedQuad)]]; 
} 

    _vertices = malloc([self.quads count] * sizeof(CGPoint) * 4); 
    _colors = malloc([self.quads count] * sizeof(GLKVector4) * 4); 
} 

...

- (void)render { 
[self.effect prepareToDraw]; 

int i = 0; 
int c = 0; 
for (NSValue *aQuad in self.quads) { 
    TexturedQuad quad; 
    [aQuad getValue:&quad]; 

    long offset = (long)&quad; 


    float randomRed = (arc4random() % 100)/100.; 
    float randomeGreen = (arc4random() % 100)/100.; 
    float randomBlue = (arc4random() % 100)/100.; 


    _vertices[i] = quad.bl.geometryVertex; 
    ++i; 
    _vertices[i] = quad.br.geometryVertex; 
    ++i; 
    _vertices[i] = quad.tl.geometryVertex; 
    ++i; 
    _vertices[i] = quad.tr.geometryVertex; 
    ++i; 

    _colors[c] = GLKVector4Make(randomRed, randomeGreen, randomBlue, 1.); 
    ++c; 
    _colors[c] = GLKVector4Make(randomRed, randomeGreen, randomBlue, 1.); 
    ++c; 
    _colors[c] = GLKVector4Make(randomRed, randomeGreen, randomBlue, 1.); 
    ++c; 
    _colors[c] = GLKVector4Make(randomRed, randomeGreen, randomBlue, 1.); 
    ++c; 
} 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, _vertices); 
    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, _colors); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, i); 
} 

通過將在循環中調用glDrawArrays和工作用每一獨立畫他們四分之一,而不是批量渲染如預期的那樣,但不是最佳的。

任何幫助將不勝感激!

回答

0

發生什麼最好的選擇是您的GL_TRIANGLE_STRIP有問題。看起來像是在每個矩形後面都繪製了一個額外的三角形(你可以看到它形成了每個矩形的前2個頂點,而最後一個矩形形成了下一個矩形的左下角,因爲這些頂點具有不同的顏色,所以它顯示爲某種混合)。

無論如何,對於三角形條,每個矩形只需要2個頂點(如果你願意的話可以結束)(如果你願意的話結束),但是如果你做得對,你會在整個場景中獲得一個很好的混合幽靈,因爲再次頂點將具有不同的顏色。

如果你想要做的只是讓那些沒有混合的顏色的矩形,看起來你需要做的就是將GL_TRIANGLE_STRIP切換到GL_TRIANGLES