OpenGL的glViewport視口變換函數詳解[轉]


調用glViewPort函數來決定視見區域,告訴OpenGL應把渲染之后的圖形繪制在窗體的哪個部位。當視見區域是整個窗體時,OpenGL將把渲染結果繪制到整個窗口。

void glViewPort(GLInt x; GLInt y; GLSizei Width; GLSizei Height);

    其中,參數X,Y指定了視見區域的左下角在窗口中的位置,一般情況下為(0,0),Width和Height指定了視見區域的寬度和高度。注意OpenGL使用的窗口坐標和WindowsGDI使用的窗口坐標是不一樣的。圖3.1-1表示了在WindowsGDI中的窗口坐標,而圖3.1-2則是OpenGL所定義的窗口坐標。

 

 

 

    例如,要設置如圖3.1-3中的視見區域,我們應該調用函數:

      glViewPort(100,100,Width,Height);

                 圖3.1-3

glViewport()函數可以實現拆分窗口的功能,可以用不同的視口多次繪制同一個物體,如,為了創建兩個並排的窗口,可以使用下面的這些函數,並輔以適當的模型視圖和投影變換:

glViewport(0, 0, sizex/2, sizey);

glViewport(sizex/2, 0,sizex/2, sizey);

  

 1 #include <gl/glut.h>
 2 
 3 //不顯示控制台窗口
 4 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
 5 
 6 void display()
 7 {
 8     glClear(GL_COLOR_BUFFER_BIT);
 9     glColor3f(1.0, 0.0, 0.0);
10     //畫分割線,分成四個視見區
11     glViewport(0, 0, 400, 400);
12     glBegin(GL_LINES);
13     glVertex2f(-1.0, 0);
14     glVertex2f(1.0, 0);
15     glVertex2f(0.0, -1.0);
16     glVertex2f(0.0, 1.0);
17     glEnd();
18     
19     //定義在左下角的區域
20     glColor3f(0.0, 1.0, 0.0);
21     glViewport(0, 0, 200, 200);
22     glBegin(GL_POLYGON);
23     glVertex2f(-0.5, -0.5);
24     glVertex2f(-0.5, 0.5);
25     glVertex2f(0.5, 0.5);
26     glVertex2f(0.5, -0.5);
27     glEnd();
28 
29 
30     //定義在右上角的區域
31     glColor3f(0.0, 0.0, 1.0);
32     glViewport(200, 200, 200, 200);//注意,后面這兩個參數是高度和寬度,而不是坐標
33     glBegin(GL_POLYGON);
34     glVertex2f(-0.5, -0.5);
35     glVertex2f(-0.5, 0.5);
36     glVertex2f(0.5, 0.5);
37     glVertex2f(0.5, -0.5);
38     glEnd();
39 
40     //定義在左上角的區域
41     glColor3f(1.0, 0.0, 0.0);
42     glViewport(0, 200, 200, 200);//注意,后面這兩個參數是高度和寬度,而不是坐標
43     glBegin(GL_POLYGON);
44     glVertex2f(-0.5, -0.5);
45     glVertex2f(-0.5, 0.5);
46     glVertex2f(0.5, 0.5);
47     glVertex2f(0.5, -0.5);
48     glEnd();
49 
50     //定義在右下角
51     glColor3f(1.0, 1.0, 1.0);
52     glViewport(200, 0, 200, 200);//注意,后面這兩個參數是高度和寬度,而不是坐標
53     glBegin(GL_POLYGON);
54     glVertex2f(-0.5, -0.5);
55     glVertex2f(-0.5, 0.5);
56     glVertex2f(0.5, 0.5);
57     glVertex2f(0.5, -0.5);
58     glEnd();
59     glFlush();
60 }
61 
62 void init()
63 {
64     glClearColor(0.0, 0.0, 0.0, 0.0);
65     glColor3f(1.0, 1.0, 1.0);
66     
67     glMatrixMode(GL_PROJECTION);
68     glLoadIdentity();
69 
70     //定義剪裁面
71     gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
72 }
73 
74 int main(int argc, char ** argv)
75 {
76     glutInit(&argc, argv);
77     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
78     glutInitWindowPosition(100, 100);
79     glutInitWindowSize(400, 400);
80     glutCreateWindow("蔣昌松_使用glbegin_glend_glViewport");
81     glutDisplayFunc(display);
82 
83     init();
84     glutMainLoop();
85 }

 

轉至:http://blog.csdn.net/why_study/article/details/8204838


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM