지난 주부터 화면에 PNG를로드하고 표시하려고 시도했습니다. 라이브러리 libpng를 사용하여 png를 메모리에 복사 한 다음 glDrawPixels를 사용하여 화면에 표시했습니다. 결과는 다음입니다 :OpenGL + libpng : 이미지 색상이 잘못되었습니다.
원본 사진 :은 "게임"에
이스크린 샷 :
그리고 코드를, 나는 정적 이미지를 사용하고 있습니다 : 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);
}
은 색상이 실제보다 다릅니다. 아무도 내 문제를 해결하는 방법을 알아낼 수 있습니까?
이 왜 밉맵을 생성하는? 'glDrawPixels()'를 사용하려는 이유는 무엇입니까? – genpfault
내 응용 프로그램에서 사소한 문제를 발견해 주셔서 감사합니다. 나는 당신이 말한 첫 번째 문제를 해결했지만, 상대적으로 두 번째 요점은, 당신은 내 말을 볼 수 있습니다 구글 번역에 "나는 지금 다음과 같은 라인을 신경 쓰지 않아 ". 나는 제목에 중요한 문제에 집중할 것을 요청할 것이다. –
Image :: images.insert도 주석 위에 있어야하며, 신경 쓰지 마십시오. –