OpenGL的glViewport视口变换函数详解[转]

摘要:
调用glViewPort函数以确定查看区域,并告诉OpenGL应在窗体的哪个部分绘制渲染图形。voidglViewPort;参数X和Y指定窗口中查看区域左下角的位置,通常为(0,0)。宽度和高度指定查看区域的宽度和高度。请注意,OpenGL使用的窗口坐标与Windows GDI使用的不同。图3.1-1显示了Windows GDI中的窗口坐标,而图3.1-2是OpenGL定义的窗口坐标。

调用glViewPort函数来决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。

voidglViewPort(GLInt x; GLInty; GLSizeiWidth; GLSizeiHeight);

    其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。图3.1-1表示了在WindowsGDI中的窗口坐标,而图3.1-2则是OpenGL所定义的窗口坐标。

 OpenGL的glViewport视口变换函数详解[转]第1张

OpenGL的glViewport视口变换函数详解[转]第2张

    例如,要设置如图3.1-3中的视见区域,我们应该调用函数:

      glViewPort(100,100,Width,Height);

OpenGL的glViewport视口变换函数详解[转]第3张

                 图3.1-3

glViewport()函数可以实现拆分窗口的功能,可以用不同的视口多次绘制同一个物体,如,为了创建两个并排的窗口,可以使用下面的这些函数,并辅以适当的模型视图和投影变换:

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

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

  

理解glViewport和 gluOrtho2D的好例子:
 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 }

OpenGL的glViewport视口变换函数详解[转]第4张

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

免责声明:文章转载自《OpenGL的glViewport视口变换函数详解[转]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL Convert的用法[HDOJ2065]"红色病毒"问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenGL_棋盘

#include "stdafx.h" #include <gl/glut.h> void myInit(void) { glClearColor(0.2, 0.2, 0.2, 0.0);//设置背景颜色为白; glColor3f(0.0f, 0.0f, 0.0f);//设置绘图颜色为黑; glPointSize(1.0);//设置点大小...

基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

  事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求。 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式。所以同时渲染粒子系统和其他纹理时会得不到想要的结果,渲染器还存在许多的不足: 1、当渲染许多透明图形时,没有对其进行排序,使得本应透明的图形没有透明。 2、不能对不同的...

Qt OpenGL 2D图像文字

这次教程中,我们将学会如何使用四边形纹理贴图把文字显示在屏幕上。我们将把256个不同的文字从一个256×256的纹理图像中一个个提取出来,接着创建一个输出函数来创建任意我们希望的文字。 还记得在第一篇字体教程中我提到使用纹理在屏幕上绘制文字吗?通常当你使用纹理绘制文字时你会调用你最喜欢的图像处理程序,选择一种字体,然后输入你想显示的文字或段落,然后保存下来...

Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生

  转载请注明出处 本文出自Hansion的博客 OpenGL ES (OpenGL for Embedded Systems)         是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,主要用来开发3D图形应用 Android支持以下几个版本的OpenGL ES API:         OpenGL ES...

OpenGL的glOrtho平行投影函数详解[转]

glortho函数可以将当前的可视空间设置为正投影空间。基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: voidglOrtho(GLdoubleleft,                   GLdoubleright,                    GLdoublebottom...

Android平台下OpenGL初步使用

本文只关注于如何一步步实现在Android平台下运用OpenGl。 1、GLSurfaceView GLSurfaceView是Android应用程序中实现OpenGl画图的重要组成部分。GLSurfaceView中封装了一个Surface。而android平台下关于图像的现实,差不多都是由Surface来实现的。 2、Renderer 有了GLSurfa...