0

不透明から透明になる単純な 16x16 パーティクルがあります。残念ながら、私の iPhone ポートでは異なっているように見え、コードのどこが違うのかわかりません。ほとんどのコードは本質的に同じです。

問題を示すためにここに画像をアップロードしました

左側のパーティクルは正しくレンダリングされていない iPhone バージョンで、右側は Mac と Windows での表示です。シンプルな RGBA .png ファイルです。

多数のブレンド関数と glTexEnv 設定を試しましたが、それらを同じにすることはできません。

念のために言っておきますが、iPhone でテクスチャをロードするコードは次のようになります。


GLuint TextureLoader::LoadTexture(const char *path)
{
    NSString *macPath = [NSString stringWithCString:path length:strlen(path)]; 
    GLuint texture = 0;

    CGImageRef textureImage = [UIImage imageNamed:macPath].CGImage;
    if (textureImage == nil)
    {
        NSLog(@"Failed to load texture image");
        return 0;
    }

    NSInteger texWidth = CGImageGetWidth(textureImage);
        NSInteger texHeight = CGImageGetHeight(textureImage);

    GLubyte *textureData = new GLubyte[texWidth * texHeight * 4];
    memset(textureData, 0, texWidth * texHeight * 4);

    CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast);
    CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);

    CGContextRelease(textureContext);

    //Make a texture ID, bind it, create it
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

    delete[] textureData;

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return texture;
}

私が使用するブレンド関数は glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); です。

これは私にとって少し謎だったので、人々が私に投げかけたアイデアを試してみます.

乾杯。

4

2 に答える 2

0

これは、標準的な「テクスチャが事前に乗算されたアルファに変換される」問題のように見えます。

あなたが使用することができます

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

または、事前乗算を回避するカスタム ローディング コードを作成することもできます。

于 2009-09-09T21:33:53.823 に答える
0

私を素朴だと呼んでください。しかし、画像を事前に乗算するには (a r、a g、a*b、a) が必要であることを見て、RGB 値を a で除算するだけでよいと考えました。

もちろん、アルファ値が r、g、b コンポーネントよりも大きくなるとすぐに、パーティクル テクスチャは黒くなります。しかたがない。上記のものとは異なる画像ローダーが見つからない限り、すべての RGB コンポーネントを 0xff (白) にします。私は白い粒子が必要であるか、アプリケーションで単に色付けする必要があるため、これは私にとって良い一時的な解決策です. これは主に非常に小さな 16x16 および小さなパーティクル テクスチャ用であるため、後で生の rgba ファイルを作成して読み込むことができます。

複数のパーティクル テクスチャを重ねると色が飽和しすぎるため、パーティクル システムに Premultiplied テクスチャを使用できません。

于 2009-09-12T06:09:09.137 に答える