одинаковое связывание текстур на каждом "кваде" - PullRequest
0 голосов
/ 04 января 2012

У меня есть 6 квадратов, состоящих из 2-х траншей, каждый из которых должен иметь свою текстуру.Вместо этого у каждой текстуры есть последняя связанная текстура вместо ее собственной.Вот мой 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);


}

Ответы [ 2 ]

0 голосов
/ 04 января 2012

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

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

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

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

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

0 голосов
/ 04 января 2012

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

...