2012-12-13 2 views
1

지난 주부터 화면에 PNG를로드하고 표시하려고 시도했습니다. 라이브러리 libpng를 사용하여 png를 메모리에 복사 한 다음 glDrawPixels를 사용하여 화면에 표시했습니다. 결과는 다음입니다 :OpenGL + libpng : 이미지 색상이 잘못되었습니다.

원본 사진 :은 "게임"에

enter image description here

스크린 샷 :

enter image description here

그리고 코드를, 나는 정적 이미지를 사용하고 있습니다 : loadPNG를 사용하여 PNG를지도에로드하면 다음과 같습니다.

bool Image::loadPNG(std::string _image, FILE * file, unsigned char header[ 54 ]) 
{ 
    fseek(file, 8, SEEK_SET); 
    ImageData* imageData = new ImageData(); 
    Image* image = new Image(); 
    image->type = IMAGETYPE_PNG; 
    imageData->image = image; 
    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 

    if(!png_ptr) 
    { 
     std::cout << "png_create_read_struct failed. " << std::endl; 
     return false; 
    } 

    png_infop info_ptr = png_create_info_struct(png_ptr); 

    if(!info_ptr) 
    { 
     std::cout << "png_create_info_struct failed. " << std::endl; 
     return false; 
    } 

    if(setjmp(png_jmpbuf(png_ptr))) 
    { 
     std::cout << "Error during init_io. " << std::endl; 
     return false; 
    } 

    png_init_io(png_ptr, file); 
    png_set_sig_bytes(png_ptr, 8); 
    png_read_info(png_ptr, info_ptr); 
    png_set_strip_16(png_ptr); 
    png_read_update_info(png_ptr, info_ptr); 
    int bit_depth; 
    int color; 
    png_get_IHDR(png_ptr, info_ptr, &image->width, &image->height, &bit_depth, &color, NULL, NULL, NULL); 
    png_read_update_info(png_ptr, info_ptr); 
    int pitch = png_get_rowbytes(png_ptr, info_ptr); 
    image->image = new unsigned char[pitch * image->height]; 
    png_bytep* row_pointers = new png_bytep[image->height]; 

    for (int y = 0; y < image->height; y++) 
     row_pointers[image->height - 1 - y] = image->image + y * pitch; 

    png_read_image(png_ptr, row_pointers); 
    delete[] row_pointers; 

    // tym na razie dupy sobie nie zawracam 

    Image::images.insert(std::pair< std::string, ImageData* >(_image, imageData)); 
    glGenTextures(1, &imageData->texture); 
    glBindTexture(GL_TEXTURE_2D, imageData->texture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, image->image); 
    gluBuild2DMipmaps(GL_TEXTURE_2D, 4, image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->image); 
    return true; 
} 

그리고 마지막으로는 OpenGL을에서 그것을 보여주는 : 당신이 볼 수 있듯이

Image* image = Image::images["f.png"]->image; 

if(image) 
{ 
    glDisable(GL_DEPTH_TEST); 
    glPushMatrix(); 
    //glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 

    float nx = 0.0f; 
    float ny = 0.0f; 

    glLoadIdentity(); 
    glTranslatef(0, 0, -1); 

    if(nx > 0 || ny > 0) 
     glRasterPos2f(nx, ny); 

    else 
    { 
     glRasterPos2f(0, 0); 
     glBitmap(0,0,0,0, nx, ny, NULL); 
    } 

    glDrawPixels(image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->image); 
    glPopMatrix(); 
    glEnable(GL_DEPTH_TEST); 
} 

은 색상이 실제보다 다릅니다. 아무도 내 문제를 해결하는 방법을 알아낼 수 있습니까?

+2

이 왜 밉맵을 생성하는? 'glDrawPixels()'를 사용하려는 이유는 무엇입니까? – genpfault

+0

내 응용 프로그램에서 사소한 문제를 발견해 주셔서 감사합니다. 나는 당신이 말한 첫 번째 문제를 해결했지만, 상대적으로 두 번째 요점은, 당신은 내 말을 볼 수 있습니다 구글 번역에 "나는 지금 다음과 같은 라인을 신경 쓰지 않아 ". 나는 제목에 중요한 문제에 집중할 것을 요청할 것이다. –

+0

Image :: images.insert도 주석 위에 있어야하며, 신경 쓰지 마십시오. –

답변

1

색상 채널을 바꿔 놓은 것처럼 보입니다. glTexImage2D()으로 전화를 걸 때 GL_BGRA_EXTGL_RGBA으로 변경하십시오. 또는 문제가 해결되지 않으면 GL_UNSIGNED_BYTEGL_UNSIGNED_INT_8_8_8_8_REV으로 변경하십시오.

+0

힌트에 따라 변경되었지만 아무런 변화가 없습니다. –

0

이미지가 아마도 (곱하기?) 혼합을 사용하여 그려지는 것처럼 보입니다.

알파 블렌딩이 활성화되어 있습니까? (이미지에 알파 채널이있는 것 같습니다)

어떤 혼합 모드를 설정 했습니까?

그것은 아마되어야합니다 :`GL_TEXTURE_MIN_FILTER`이 GL_NEAREST` '로 설정되어있는 경우

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

나는 이것을 정확히 가지고 있으며 이미 GLUT의 "init"함수 안에있다. –

+0

drawpixel의 크기 및 바이어스 값을 설정 했습니까? – JasonD

+0

방법? 설명해 주시겠습니까? –

관련 문제