2011-10-29 15 views
4

GLKitでPNGイメージに色を付けることに問題があります。GLKit&テクスチャにテクスチャを追加する

私は、アプリケーションにロードし、テクスチャを作成するためにそれを使用し、白の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); 
} 

誰もが

レザ

答えて

2

おかげで、私は私の問題を解決するために管理していると、ここで解決策を

-(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); 
} 
で、この問題を解決するのに役立つ可能性があり
関連する問題