2017-09-18 14 views
0

iOS 용 그리기 응용 프로그램의 일부로 OpenGL을 사용하고 있습니다. 사용자가 그리기를 끝내면 텍스처가 SOIL을 사용하여 jpg에 저장됩니다. 이미지가보기에 올바르게 표시됩니다. 출력을 저장하면 이미지가 반전 된 후 올바른 방향으로 표시되지만 이미지는 원하는 것보다 작은 크기로 조정됩니다 (더 높은 해상도의 장치는 작은 이미지를 생성 함).OpenGL은 SOIL을 사용하여 jpg 만 생성합니다. 이미지 크기 만 맞지 않습니다.

나는 다음 오전 프로세스는 다음과 같습니다

unsigned char *pixels = (unsigned char*)malloc(4* imgwidth* imgheight); 
glBindTexture(GL_TEXTURE_2D, 0); 
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, imgwidth, imgheight); 
glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei (GL_UNPACK_SKIP_ROWS, 1); 
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 1); 
glReadPixels(0, 0, imgwidth, imgheight, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) pixels); 
invertPixels(pixels); 
int result; 
result = SOIL_save_image_quality(imagepath, SOIL_SAVE_TYPE_JPG, d, imgheight, 4, pixel_data, 99); 
delete [] pixel; 

나는 이미지가 같은 크기이지만 거꾸로하지 않고, 죽음에 반전 알고리즘을 분석하고 그 일을 확신했다. 무엇이 이것을 일으킬 수 있습니까? 텍스처를 다시 조절해야합니까?

답변

0

이것은 CAEAGLLayer의 contentsScale (또는 GLKView의 contentScaleFactor)과 관련이 있다고 생각합니다. 응용 프로그램의 값은 1.0, 2.0 또는 3.0이어야합니다. 1.0은 망막 디스플레이의 품질을 떨어 뜨립니다. 망막에 텍스쳐를 만들 때 예상되는 결과를 위해 CAEAGLLayer의 contentScale으로 크기를 조절해야합니다. 1.0이 아니라면 더 큰 크기의 텍스처를 만들어야한다는 뜻입니다. 나는 SOIL을 사용하지 않았지만 그 반대가 사실이어야한다. 따라서 예상 한 이미지 크기를 얻으려면 이미지 크기를 조절해야한다고 생각합니다.

참고로 표시된 바와 같이 here, 우리는 성능을 위해 교역 품질로 contentsScale을 변경할 수 있습니다. 내 OpenGL 응용 프로그램은 더 나은 렌더링 성능을 위해 iphone7 +에서도 항상 contentScale을 2.0으로 설정합니다. 그래서 iphone7이 2.0이거나 iphone7 +가 3.0 인 것처럼 하드 코드하지 마십시오.

+0

의견을 보내 주셔서 감사합니다. 게시글을 사용하면 문제에 더 가까워졌지만 콘텐츠 배율 조정만으로는 해결할 수 없습니다. contentScalingFactor를 늘리면 이미지 크기가 예상보다 가깝지만 이제는 중심에서 벗어난 것으로 확인되었습니다. (0,0, w, h)는 이미지의 아래쪽과 왼쪽을 잘라냅니다. 게시물 (https://stackoverflow.com/questions/9155515/glreadpixels-only-saves-1-4-screen-size-snapshots)은 내가 경험 한 것보다 더 큽니다. 나는 C++에서 작동하고 Obj-C가 아니며 SOIL은 프레임 버퍼 유형을 부호없는 바이트로 변경하지 못하게한다. – Randoramma

+0

빠른 질문 : 원본 콘텐츠를 1.0으로 조정 했습니까? – beshio

+0

아니요, 장치 유형에 따라 EAGLcontext에 의해 자동으로 설정되었습니다. – Randoramma