문제
예를 들어 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를 선택하고 다시 그리기를 선택하십시오. 그렇지 않으면 섹션을 완전히 건너 뛰십시오.
이는 귀중한 처리 능력을 보존하고 코드가 창 및 뷰포트 계산을 수동으로 관리 할 필요로부터를 줄입니다.