OS X SierraのSDL2 2.0.7およびSDL2_image 2.0.2を使用して、アルファチャンネルでエンハンスされた高さマップを使用して、32ビットRGBAノーマルマップテクスチャを読み込みます。OS Xの表面をロードするときにSDL2アルファチャンネルを事前に乗算する?
これらのテクスチャのすべてのピクセルは、方向ノーマルベクトルを符号化し、ゼロでないRGB値を持ちます。 (0,0,0)の方向ベクトル(すなわち黒)は無効です。
私はSDL2_imageを介して、このようなテクスチャをロードするとき、まだ、0の0 も収率RGB値のアルファ値を有するテクスチャーの領域は、私は、SDLは、おそらくこれらのピクセルのアルファ値を事前に乗算されると思います?
これらのノーマルマップテクスチャのいずれかが添付されています。あなたはそれが有効であることを確認することができます。 GIMPを使用し、透明領域の1つでカラーピッカーを使用します。確かに、透明領域にはまだ青色(エンコードされた法線ベクトル)のRGBカラーがあります。
そして以下に添付PNGファイルの問題を示す、最小限のテストケースである:
#include <SDL_image.h>
#include <assert.h>
int main(int argc, char **argv) {
SDL_Surface *s = IMG_Load("green3_2_nm.png");
assert(s);
for (int i = 0; i < s->w * s->h; i++) {
const Uint32 *in = (Uint32 *) (s->pixels + i * s->format->BytesPerPixel);
SDL_Color color;
SDL_GetRGBA(*in, s->format, &color.r, &color.g, &color.b, &color.a);
assert(color.r || color.g || color.b);
}
SDL_FreeSurface(s);
return 0;
}
私はgcc $(pkg-config --cflags --libs sdl2_image) test.c
ライン15上の主張で、このテストケースをコンパイルしていますいくつかの行が画像に失敗します。つまり、正確にアルファ値が0に下がったところです。
私は試しましたTGAとPNGの両方の画像フォーマットをサポートしていますが、SDLはその両方に同じことを行います。
これはSDLのバグですか、それとも不足していますか?私は人々が他のプラットフォームでも同じ問題を抱えているのが不思議です。
===
回答: - 常にコアグラフィックス、アップルのOS X上SDL2_imageのデフォルトの画像の読み込みバックエンド、事前乗算アルファ確かにありません。解決策は、コアグラフィックスのサポートなしでSDL2_imageを再コンパイルし、代わりのlibpng、のlibjpeg、およびその他の必要な画像コーデックを有効にするには、次のとおりです。
./configure \
--disable-imageio \
--disable-png-shared \
--disable-tif-shared \
--disable-jpg-shared \
--disable-webp-shared
私のシステムでは、私はコアグラフィックス(imageio
)を無効にしなければならなかったともあなたが見ることができるように、他のコーデックの共有ライブラリの読み込み。これはlibpng、libjpgなどと静的にリンクされていたfat SDL2_image.so
を生成しましたが、期待どおりに動作しました。
ありがとうございました。私がそれを受け入れる前に、なぜこれもTGA画像の場合にも説明できますか?私はSDLがデコードしてロードするのは正しいと思いますか?もしそうなら、なぜ彼らもこの問題を抱えていますか? – jdolan
SDLは、コアグラフィックスがサポートするすべてのフォーマット(TGA、TIFFなど)で、macOS上でCore Graphicsを使用します。 –
SDL_imageはイメージ自体を実際にはデコードしません。それはそのためのライブラリを使用します。 SDL_imageは、他のすべてのライブラリとの共通インタフェースをラッパーに提供するだけです。 (いくつかの例外があるかもしれません。) –