2016-07-08 2 views
-1

OpenGL을 사용하여 3D 장면을 윈도우에 직접 렌더링하는 프로젝트를 상속 받았습니다. 이 코드는 정상적으로 작동하지만 3D 뷰에 "3D 뷰 모드 종료"아이콘이 그려집니다. 이것은 또한 잘 작동하지만,보기가 빠르게 회전함에 따라 깜박임이 많이 발생합니다.OpenGL을 오프 스크린 비트 맵으로 그립니다.

오프 스크린 비트 맵 (예 : HWND가없는)을 그릴 수 있고 내 아이콘을 비트 맵에 그리고 마지막으로 더블 버퍼링을 사용하여 비트 맵 StretchBlt 비트 맵을 그릴 수 있습니다. OpenGL을 필요로하지 않는 이미지를 확대하는 것과 같은 다른 상황에서도이 작업을 수행합니다. 내 문제는 내가 OpenGL 초보자이며 오프 스크린 비트 맵의 ​​DC로 시작하여이 DC에서 HWND를 만드는 모든 시도가 일반적으로 DC의 픽셀 형식을 선택했기 때문에 실패합니다.

StackOverflow (eg. this question without an accepted answer)에서 이와 유사한 질문을하는 몇 가지 질문이 있습니다. 절차가 설명되어있는 비교적 간단한 자습서가 있습니까? 프로세스가 매우 복잡하여 자세한 OpenGL 지식이 필요하다면 그것은 우리의 소프트웨어에 거의 사용되지 모드이기 때문에 그것을두고 깜빡 거림과 함께 생활합니다.

답변

0

그냥 질감 쿼드를 사용하여 OpenGL을을 사용하여 아이콘을 그립니다.

DC StretchBlt에 비트 맵 사본이 모든 무승부는 몇 가지 포함 그래픽 메모리 (대역폭 낭비)에서 왕복으로 이동하고 StretchBlt는 GPU 가속화되지 않을 것입니다. 원하는 것은 비효율적이며 품질을 저하시킬 수도 있습니다.

실행 파일에 리소스로 저장된 아이콘이 있다고 가정합니다. 가장 간단한 방법은 DIBSECTION (CreateDIBSection)을 사용하여 메모리 DC (CreateCompatibleDC)를 만들고 아이콘을 그려 DIBSECTION 데이터를 OpenGL 텍스처로로드하는 것입니다. 그런 다음 아이콘을 그리려면 glViewport을 사용하여 창 좌표에서 대상 사각형을 선택하고, ID 변환을 사용하여 전체 뷰포트 (위치 값 (-1,1) → (1,1)), 텍스처 좌표 값 (0, 0) → (1,1)은 올바른 결과를 제공합니다.

중요한 수정 사항 : 프로그램에서 창 크기 조정 핸들러에 뷰포트 및 고정 함수 파이프 라인 GL_PROJECTION 행렬을 설정하는 것과 같은 바보 같은 작업을 수행 할 경우 해당 반 패턴을 정리하고이 패턴을 소속 된 위치로 옮겨야합니다.

관련 문제