GLKit &为纹理添加色调

发布于 2024-12-12 06:15:37 字数 1703 浏览 1 评论 0原文

我在使用 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);
}

任何人都可以帮助解决这个问题吗 谢谢雷扎

I am having issue with tinting a PNG image with GLKit.

I have a white PNG image that I load into the application and then use it to create a texture:

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);
}

the texture is created with no errors.

however when I want to render the texture with blend activated the colour seems to be ignored and I get a white image. I had no issues when I was doing this in OpenGL1 were the image would pick up the colour that was defined in glColor4f(). Here is my render code:

-(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);
}

Could anybody help to solve this issue
Thanks

Reza

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初雪 2024-12-19 06:15:37

我已经成功解决了我的问题,这是解决方案

-(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);
}

I have managed to solve my problem and here is the solution

-(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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文