문제

예를 들어 Ortographic Projection을 사용하고 다른 하나는 관점을 사용하여 OpenGL에서 동일한 객체를 표시해야합니다. 이렇게하려면 glviewport ()로 호출 한 후 객체를 다시 그려야합니까?

도움이 되었습니까?

해결책

Nehe 이 작업을 수행하는 방법에 대한 훌륭한 자습서가 있으며 그의 사이트는 일반적으로 OpenGL 질문에 좋은 리소스입니다.

다른 팁

 // normal mode
  if(!divided_view_port)
    glViewport(0, 0, w, h);
else
{
    // right bottom
    glViewport(w/2, h/2, w, h);
    glLoadIdentity ();
    gluLookAt(5.0f, 5.0f, 5.0f,
              0.0f, 0.0f, 0.0f,
              0.0f, 1.0f, 0.0f);

    display();

    // left bottom
    glViewport(0, h/2, w/2, h);
    glLoadIdentity();
    gluLookAt (5.0f, 0.0f, 0.0f,
              0.0f, 0.0f, 0.0f,
              0.0f, 1.0f, 0.0f);

    display();

    // top right
    glViewport(w/2, 0, w, h/2);
    glLoadIdentity();
    gluLookAt(0.0f, 0.0f, 5.0f,
              0.0f, 0.0f, 0.0f,
              0.0f, 1.0f, 0.0f);

    display();

    // top left
    glViewport(0, 0, w/2, h/2);
    glLoadIdentity();
    gluLookAt(0.0f, 5.0f, 0.0f,
              0.0f, 0.0f, 0.0f,
              0.0f, 1.0f, 0.0f);

    display();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

if (w <= h)
    glOrtho(-2.0, 2.0, 
            -2.0 * (GLfloat) h / (GLfloat) w, 2.0 * (GLfloat) h / (GLfloat) w, 
    -10.0, 100.0); 
else
    glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h, 
    -2.0, 2.0, 
    -10.0, 100.0);

glMatrixMode(GL_MODELVIEW);

예,

또한 가위 설정을 변경하여 동일한 창에있는 경우 두 뷰를 깨끗하게 분리해야합니다.

최소한의 실행 가능한 예

비슷하다 이 답변, 더 직접적이고 편집 가능합니다. 산출:

암호:

#include <stdlib.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

static int width;
static int height;

static void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f, 0.0f, 0.0f);

    glViewport(0, 0, width/2, height/2);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, -3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glutWireTeapot(1);

    glViewport(width/2, 0, width/2, height/2);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glutWireTeapot(1);

    glViewport(0, height/2, width/2, height/2);
    glLoadIdentity();
    gluLookAt(0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0);
    glutWireTeapot(1);

    glViewport(width/2, height/2, width/2, height/2);
    glLoadIdentity();
    gluLookAt(0.0, -3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0);
    glutWireTeapot(1);

    glFlush();
}

static void reshape(int w, int h) {
    width = w;
    height = h;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return EXIT_SUCCESS;
}

컴파일 :

gcc -lGL -lGLU -lglut main.c

OpenGL 4.5.0 NVIDIA 352.63, Ubuntu 15.10에서 테스트.

TODO : Modern OpenGL 4에서는 텍스처로 렌더링 한 다음 화면에 텍스처를 배치해야한다고 생각합니다. http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/

GL 4에서는 한 번의 렌더링 패스로 많은 뷰포트에 렌더링 할 수 있습니다. 보다 arb_viewport_array 그리고 관련 개념.

OpenGL을 현재 작업중 인 창에 출력 할 준비를하는 명령에 지나지 않는다고 생각하십시오.

Nehe의 튜토리얼조차도 다음의 중요성을 알려주는 두 가지 명령이 있습니다.

Window Device 컨텍스트 DC를 취하는 WGLCreateContext는 사용자 컨트롤, Windows 양식, GL 창 또는 다른 응용 프로그램 창 (예 : 메모장) 등 모든 창에서 얻을 수 있습니다. 이것은 OpenGL 장치 컨텍스트를 만듭니다 - 그들은 나중에 당신이 사용하는 자원 컨텍스트라고합니다.

WGLMAKECURRENT- 두 개의 매개 변수, 처리중인 장치 컨텍스트 (wglcreateContext의 Windows 장치 컨텍스트에 전달 된 매개 변수) 및 리소스 컨텍스트를 반환합니다.

이 두 가지만 활용 - 여기 내 조언이 있습니다.

Nehe의 자습서는 기존 창만 활용하는 솔루션을 제공하고 드로잉 화면을 세그먼트합니다. 자습서는 다음과 같습니다. http://nehe.gamedev.net/tutorial/multiple_viewports/20002/

Glviewport를 활용하면 모든 업데이트를 다시 주도해야합니다.

그것은 하나의 방법입니다.

그러나 덜 그래픽적이고 프로세서 강렬한 방법이 있습니다.

사용자 컨트롤을 활용하여 각보기마다 창을 만듭니다.

각 창에는 자체 HWND가 있습니다.

DC를 가져 와서 wglcreateContext를 처리 한 다음 타이머 (광산은 초당 30 프레임)에서 상태 변경을 감지하면 해당보기에 대해 WGLMAKECURRENT를 선택하고 다시 그리기를 선택하십시오. 그렇지 않으면 섹션을 완전히 건너 뛰십시오.

이는 귀중한 처리 능력을 보존하고 코드가 창 및 뷰포트 계산을 수동으로 관리 할 필요로부터를 줄입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top