2012-01-04 5 views
0

У меня есть 6 квадратов, состоящих из 2-х треугольников, каждая из которых должна иметь другую текстуру, нанесенную на нее. Вместо этого каждая текстура имеет на ней последнюю привязанную текстуру вместо ее собственной. Heres my drawView и setView:та же привязка текстуры на каждом «квадрате»

- (void)drawView:(GLView*)view 
{ 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 


    static const Vertex3D vertices[] = { 
     {0,0, 1}, //TL 
     { 1024,0, 1}, //TR 
     {0,-1024, 1}, //BL 
     { 1024.0f, -1024.0f, 1} //BR 
    }; 


    static const GLfloat texCoords[] = { 
     0.0, 1.0, 
     1.0, 1.0, 
     0.0, 0.0, 
     1.0, 0.0 
    }; 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

} 

- (void)setupView:(GLView*)view { 
    // Bind the number of textures we need. 
    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP,GL_TRUE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glLoadIdentity(); 


    NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"jpg"]; 
    NSData *texData = [[NSData alloc] initWithContentsOfFile:path]; 
    UIImage *image = [[UIImage alloc] initWithData:texData]; 

    if (image == nil) 
     NSLog(@"Do real error checking here"); 

    GLuint width = CGImageGetWidth(image.CGImage); 
    GLuint height = CGImageGetHeight(image.CGImage); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    void *imageData = malloc(height * width * 4); 
    CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

    // Flip the Y-axis 
    CGContextTranslateCTM (context, 0, height); 
    CGContextScaleCTM (context, 1.0, -1.0); 

    CGColorSpaceRelease(colorSpace); 
    CGContextClearRect(context, CGRectMake(0, 0, width, height)); 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

    CGContextRelease(context); 

    free(imageData); 


} 
+0

Я не вижу ничего очевидного в этом; можете ли вы регистрировать значения, хранящиеся в текстуре [0] с помощью glGenTextures, в качестве этапа диагностики? – Tommy

+0

NSLog (@ "текстура [0] =% d", текстура [0]); дает 0 каждый раз – jfisk

+0

Ну, это, очевидно, проблема. Я не вижу, как «glTexImage2D» может вообще функционировать без рабочего контекста, так что вы уверены, что какой-то маршрут вы случайно не попадете в «glDeleteTextures» - или, возможно, у вас есть какая-то проблема с потоками, особенно re: необходимые «glFlush», предусмотренные документацией для «EAGLSharegroup»? – Tommy

ответ

0

Вы всегда используете текстуру [0], так что вы будете получать ту же текстуру каждый раз. Вам необходимо передать идентификатор текстуры, который вы хотите использовать для glBindTexture().

+0

Моя логика заключалась в том, что каждый экземпляр этого класса будет иметь свою собственную текстуру [0], поскольку те, которые определены в файле заголовка , почему это не так? – jfisk

+0

Наверное, я в замешательстве - у вас более одного взгляда? И каждый взгляд рисует квадрат? – user1118321

+0

У меня есть 1 вид, с 6 классами, которые являются дочерью UIViewController с каждым ответственным за рисование текстурированного квадрата – jfisk

0

Я считаю, что проблема связана с текстурой связывания и, в частности, к этой линии:

glBindTexture (GL_TEXTURE_2D, текстуры [0]);

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

Вы используете шейдеры? В случае двойной проверки, но, скорее всего, это не так.

Предлагаю использовать текстурный атлас, чтобы не убивать характеристики всего движка, привязывая каждый раз другую текстуру в графическом процессоре.

+0

Каждый фрагмент - это собственный экземпляр с собственными вызовами вызова и вызовами, поэтому им путают, что они могут обращаться к одной и той же текстуре [0] стоимость. – jfisk

+1

Предлагаю вам сосредоточиться на этом. Отлаживайте значение текстуры [0] при каждом вызове. Если они имеют одинаковое значение (или ноль), то проблема есть. Каждая связанная текстура имеет свой собственный идентификатор, поэтому вы можете легко определить, является ли это проблемой привязки. –

Смежные вопросы