GLKit & текстураларға реңк қосу

GLKit арқылы PNG кескінін түсірумен айналысамын.

Менде қосымшаға жүктейтін ақ түсті PNG кескіні бар, содан кейін оны текстураны жасау үшін қолданыңыз:

UIImage *image = [ UIImage imageNamed:@"brushImage" ];
NSError *error = nil;
texture_m = [[ GLKTextureLoader textureWithCGImage:image.CGImage options:nil error:&error] retain ];
if (error) {
    NSLog(@"Error loading texture from image: %@",error);
}

текстурасы қатесіз жасалады.

алайда текстураны араластыру арқылы қосуды қаласаңыз, түстер еленбейді және ақ түсті кескінге ие боламын. Мен OpenGL1-де мұны жасаған кезде, сурет glColor4f() ішінде анықталған түске ие болатын. Міне, менің көрсету коды:

-(void)render{
    if (texture_m != nil) {
        effect_m.texture2d0.enabled = GL_TRUE;
        effect_m.texture2d0.envMode = GLKTextureEnvModeReplace;
        effect_m.texture2d0.target = GLKTextureTarget2D;
        effect_m.texture2d0.name = texture_m.name;
    }

    [effect_m prepareToDraw];

    glClear(GL_COLOR_BUFFER_BIT);


    GLfloat squareVertices[] = {
        50, 50,
        150, 50,
        50, 150,
        150, 150
    };
    GLfloat squareTexture[] = {
        0, 0,
        1, 0,
        0, 1,
        1, 1
    };


    glColor4f( 1, 0, 0, 1 );

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glEnable(GL_BLEND);
    glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );


    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, squareVertices);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, squareTexture );

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisable(GL_BLEND);
    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
}

Бұл мәселені шешуге ешкім көмектесе алмайды Рахмет

Реза

4

1 жауаптар

Мен өз мәселемді шеше алдым, мұнда шешімім бар

-(void)render
{
 if (texture_m != nil) {

          effect_m.texture2d0.enabled = GL_TRUE;

         //here you need to env mode to GLKTextureEnvModeModulate rather than GLKTextureEnvModeReplace

          effect_m.texture2d0.envMode = GLKTextureEnvModeModulate;
          effect_m.texture2d0.target = GLKTextureTarget2D;
          effect_m.texture2d0.name = texture_m.name;
     }

     //then here I have added the tint colour to the GLKBaseEffect class as constant colour which I imagine replaces the calls to  glColor4f for OpenGL1.1

     effect_m.useConstantColor = YES;
     float alphaValue = 0.7;
     GLKVector4  colour = GLKVector4Make( 0* alphaValue, 1* alphaValue, 1* alphaValue, alphaValue );
     effect_m.constantColor = colour;

    //remember multiplying the alpha value to each colour component

     [effect_m prepareToDraw];

     glClear(GL_COLOR_BUFFER_BIT);

     GLfloat squareVertices[] = {
        50, 50,
        150, 50,
        50, 150,
        150, 150
    };

    GLfloat squareTexture[] = {
        0, 0,
        1, 0,
        0, 1,
        1, 1
    };



   //glColor4f not necessary
   //glColor4f( 1, 0, 0, 1 );

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glEnable(GL_BLEND);

     glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );

    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, squareVertices);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, squareTexture );
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisable(GL_BLEND);
    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
}
2
қосылды