OS X Sierra에서 SDL2 2.0.7 및 SDL2_image 2.0.2를 통해 알파 채널로 인코딩 된 하이트 맵을 사용하여 32 비트 RGBA 법선 맵 텍스처를로드합니다.OS X에서 표면을로드 할 때 알파 채널을 미리 증량하는 SDL2?
이러한 텍스처의 모든 픽셀에는 방향 법선 벡터를 인코딩하는 0이 아닌 RGB 값이 있습니다. 방향 벡터 (0, 0, 0) (즉, 검은 색)가 잘못되었습니다.
그런데 텍스처를 SDL2_image로로드하면 알파 값이 0 인의 텍스처 영역이 0의 RGB 값을 생성합니다. SDL이이 픽셀의 알파 값을 사전에 곱한 것 같습니다 ?
이 normalmap 텍스처 중 하나가 첨부됩니다. 예를 들어 다음과 같이 텍스처를 열면 유효한지 확인할 수 있습니다. 김프를 사용하고 투명한 영역 중 하나에서 색상 선택기를 사용합니다. 실제로 투명한 영역에는 여전히 blue-ish (인코딩 된 법선 벡터) 인 RGB 색상이 있음을 알 수 있습니다.
#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;
}
내가 선 (15)에 gcc $(pkg-config --cflags --libs sdl2_image) test.c
단언이 테스트 케이스를 컴파일하고 있습니다 :
그리고 아래에 첨부 된 PNG 파일의 문제를 설명하는 최소한의 테스트 케이스입니다 즉, 알파 값이 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은 Core Graphics에서 지원하는 모든 형식 (TGA, TIFF 및 일부 포함)에 대해 macOS에서 Core Graphics를 사용합니다. –
SDL_image는 실제로 이미지 자체를 디코딩하지 않습니다. 그것을 위해 라이브러리를 사용합니다. SDL_image는 모든 다른 라이브러리에 대한 공통 인터페이스를 래퍼에 제공합니다. 일부 예외가있을 수 있습니다. –