2014-03-26 2 views
1

OpenGL을 사용하여 5 백만 개의 직사각형을 표시하는 프로그램을 작성하고 있습니다. 약 약 걸립니다. 이 직사각형을 화면에 표시하려면 3 초. 그러나 화면을 확대/축소하거나 왼쪽/오른쪽으로 팬하려고 할 때도 같은 시간이 걸립니다.전체 화면을 다시 렌더링하지 않고 OpenGL 화면을 확대/축소하는 방법

모든 것을 메모리/버퍼에 저장하는 방법이 있다면 궁금해서 화면을 여러 번 다시 그릴 필요가 없습니다.

다른 솔루션과도 열려 있습니다.

static void reshape_cb() { 
    glViewport(0, 0, (GLint) screen_width, (GLint) screen_height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D (0.0, DESIGN_SIZE, 0.0, DESIGN_SIZE); 

} 

답변

5

내가 OpenGL은 렌더링, 5 개 백만 영역을 표시하는 프로그램을 쓰고 있어요 :

다음은 내 모양 변경 기능입니다. 대략 소요됩니다. 이 직사각형을 화면에 표시하려면 3 초.

매우 비효율적으로 그리기 명령을 보내는 것처럼 들립니다. 최신 GPU는 초당 수억 개의 삼각형을 렌더링 할 수 있습니다. 내 생각 엔 당신이 즉각적인 모드를 사용하고있을 것입니다.

메모리/버퍼에 모든 것을 저장하는 방법이 있는지 궁금해서 화면을 여러 번 다시 그리지 않아도됩니다.

확대/축소는 일반적으로 시점 또는 렌더링 해상도의 변경을 의미하므로 전체 다시 그릴 필요가 있습니다.

다른 솔루션을 사용하고 있습니다. 고맙습니다.

도면 코드를 최적화해야합니다. 키워드는 다음과 같습니다

  • 정점 배열
  • 버텍스 버퍼는
  • 대형 도면 배치
+0

빠른 답장을 보내 주셔서 감사합니다. 나는 실제로 검을 읽고있다. GL_LINE_LOOP를 사용하여 각 직사각형의 좌표를 데이터베이스에서 가져옵니다. 그게 문제라고 생각하니? – user3097451

+0

@ user3097451 : 렌더링 할 때 데이터베이스에서 읽는 중입니까?음, 그렇습니다, 분명히 문제입니다. 형상 데이터가 변경된 경우에만이를 읽고 버텍스 버퍼 객체의 형태로 OpenGL 서버 측 (= GPU) 메모리에 업로드해야합니다. – datenwolf

0

나는이 장면을 그리기 3 초 걸리지 않을 것을 동의 개체.

그러나 질문에 대답하려면 : 예, 그렇게 할 수 있습니다.

별도의 공유 컨텍스트가있는 다른 스레드에서 수행 할 수도있는 오프 스크린 프레임 버퍼 (FBO)로 렌더링하므로 GUI를 차단하지 않습니다. 그런 다음 가장 최근에 렌더링 된 FBO를 사용하여 GUI를 그립니다 (이중 버퍼링하여 다른 하나를 그리면 이전 프레임을 표시 할 수 있습니다). 그런 다음 전체 대화 형 프레임 속도에서 렌더링 된 FBO를 이동하고 확대/축소 할 수 있습니다. 물론 렌더링 한 것보다 위/아래/왼쪽/오른쪽으로 더 이동할 수는 없으며 너무 크게 확대하면 (1.5 배 또는 2 배 이상) 사물이 흐려질 수 있습니다. 그러나 그것은 할 수 있습니다. 또한 다른 답변에서 언급했듯이, 시점이나 기하학 또는 음영은 바꿀 수 없으며 고정 된 사진에서 움직이는 것과 같습니다.

관련 문제