2017-10-27 1 views
3

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

단언이 테스트 케이스를 컴파일하고 있습니다 :

32 bit RGBA normalmap with alpha-encoded heightmap for parallax mapping

그리고 아래에 첨부 된 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을 생성했지만 예상대로 작동했습니다.

답변

3

SDL_image는 모든 플랫폼에서 동일한 이미지 로더를 사용하는 대신 플랫폼 별 이미지로드 코드에 대한 래퍼입니다.

  • 리눅스 : libpng를, LibJPEG
  • 맥 OS, 아이폰 OS : 코어 그래픽
  • 윈도우 : WinCodec

이 필요가 없기 때문에 이것은, SDL_image의 크기를 줄일 수있는 장점이있다 어떤 이미지 디코딩 코드와 함께 제공되며, 이미 시스템에 설치되어있을 가능성이있는 것과 동적으로 링크 할 수 있습니다.그러나 macOS 및 iOS에서 Core Graphics는 사전 순화되지 않은 알파를 지원하지 않으므로 SDL_image는이를 역순으로 사용해야합니다.

관련 항목 : mac-opengl - Re: kCGImageAlphaFirst not implemented (Was: (no subject)) 5 월 2007 (웨이 백 머신에서) :

솔직히 CGBitmapContextCreate() 곧 비, 미리 곱셈 알파 언제든지 지원을 기대하지 않을 것이다. ImageIO에서 +있는 CoreGraphics를 사용하는 경우

...

잘 모르겠어요 이제까지 정말 OpenGL 응용 프로그램에 대한 이미지 로딩 방식에 사용되는에 타겟으로했다.

이 동작은 LibSDL bug #838 - OSX SDL darkens colours proportional to increase in alpha에서 발견되었으며 SDL_image changeset 240에 해결 방법이 도입되었습니다.

해결 방법은 알파를 미리 배제하는 것만 알면 알 수 있습니다. 이것은 끔찍한 손실 프로세스입니다.

이 문제를 해결하려면 LibPNG를 사용하는 macOS에서 자신 만의 SDL_image 버전을 만들 수 있습니다. 이는 구성을 통해서만 가능하므로 SDL_image 코드 자체를 변경하지 않아도됩니다. 이렇게하려면 --disable-imageio 옵션을 사용하십시오. SDL_image는 자체 LibPNG 코드 복사본을 제공하므로 LibPNG를 설치하지 않아도됩니다.

+0

답변 해 주셔서 감사합니다. 내가 이것을 받아들이 기 전에 왜 이것이 TGA 이미지의 경우도 될 수 있는지 설명 할 수 있습니까? SDL이 자체적으로 디코딩하고로드한다고 생각합니다. 맞습니까? 그렇다면 왜이 문제를 드러내는가? – jdolan

+1

SDL은 Core Graphics에서 지원하는 모든 형식 (TGA, TIFF 및 일부 포함)에 대해 macOS에서 Core Graphics를 사용합니다. –

+0

SDL_image는 실제로 이미지 자체를 디코딩하지 않습니다. 그것을 위해 라이브러리를 사용합니다. SDL_image는 모든 다른 라이브러리에 대한 공통 인터페이스를 래퍼에 제공합니다. 일부 예외가있을 수 있습니다. –

관련 문제