문제

OpenGL에서 제공하는 래스터 변환 방법을 올바르게 사용하는 방법에 대한 온라인 예제는 많지 않은 것 같습니다.

간단한 삼각형을 그렸는데, 그 삼각형을 복사해서 다른 곳에 다시 그리려고 합니다.이해할 수 없는 매우 특이한 결과가 나타납니다.

주어진 삼각형(분홍색):verts [3] = { {10.0, 25.0}, {125.0, 25.0}, {60.0, 60} };

나는 삼각형을 표시했습니다 :

glClear (GL_COLOR_BUFFER_BIT);  // Clear display window.
glColor3f (1.0, 0.5, 0.5);      // Set initial fill color (pink).
triangle (verts);           // Display colored triangle.

그런 다음 래스터 변환을 통해 삼각형을 다시 그리기 위해 다음을 수행했습니다.

GLubyte *data [115][35];
glReadPixels(10, 25, 115, 35, GL_RGB, GL_UNSIGNED_BYTE, data);
glRasterPos2i(50,100);  
glDrawPixels(35, 115, GL_RGB, GL_UNSIGNED_BYTE, data);

내가 생각한 것은 (10, 25)에서 시작하여 오른쪽으로 300픽셀 위로 이동하는 모든 픽셀을 복사하는 것이었습니다.이것은 삼각형을 포함하는 것 이상입니다.

그런 다음 픽셀을 그리면 그대로 동일하게 그릴 뿐이라고 생각했지만 대신 내가 전혀 이해하지 못하는 회색 상자를 그리는 것입니다.

올바른 사용법은 무엇입니까 glReadPixels(...); 그리고 glDrawPixels(...)?

현재 사용 중 회색 상자가 표시되고 이미지의 픽셀을 복사하거나 그리지 않는 이유는 무엇입니까?

enter image description here

도움이 되었습니까?

해결책

오랜 대화 끝에 몇 가지 문제가 드러났습니다.

  1. GL_RGB 픽셀은 별로 마음에 들지 않습니다. glReadPixels (...) 그리고 glDrawPixels (...)

    • 기본 픽셀 저장소를 사용하여 GL은 읽은 각 행을 4바이트 경계에 저장하려고 합니다.3바이트 RGB 픽셀은 OpenGL의 이것과 다른 많은 것들을 완전히 혼란스럽게 만듭니다.

    • 당신은 전화해야합니다 glPixelStorei (GL_PACK_ALIGNMENT, 1) ~ 전에 glReadPixels (...)GL_RGB 형식을 지정하거나 각 행의 끝 부분을 채울 수 있습니다. 산출 4바이트 행 정렬을 충족하기 위해 추가 바이트를 사용합니다.선택하지 않은 상태로 두면 기본 정렬로 인해 결국 메모리 오버런이 발생합니다.

    • 마찬가지로, 당신은 사용해야합니다 glPixelStorei (GL_UNPACK_ALIGNMENT, 1) ~ 전에 glDrawPixels (...) 따라서 행을 읽는 동안 4바이트 정렬을 유지하기 위해 바이트를 건너뛰려고 하지 않습니다. 입력 데이터.

  2. 배열이 잘못 선언되어 포인터 배열을 할당했습니다.

    • a에 대한 포인터 GLubyte 에 비해 상당히 크다 GLubyte (컴파일러/CPU에 따라 4~8배 커짐)

    • 픽셀 배열을 선언하는 올바른 방법은 다음과 같습니다. GLubyte data [115 * 35 * 3], 115 * 35 픽셀, 각 3바이트를 저장합니다.

  3. 래스터 위치는 객체 공간 좌표에 있지만 glReadPixels (...) 창 공간 좌표에 있습니다.

    • 적절한 투영 매트릭스, 뷰포트 등이 없습니다.좌표계(객체와 창) 사이의 배율이 일치하지 않으며 삼각형이 115라고 정확하게 말할 수 없습니다. 픽셀 키가 크고 35세 픽셀 넓습니다(객체 공간 차원입니다).
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top