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);

理解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 }

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

时间: 2024-10-05 04:58:33

OpenGL的glViewport视口变换函数详解[转]的相关文章

OpenGL的glTranslatef平移变换函数详解

OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先看定义:void glTranslated(GLdouble x,    GLdouble y,    GLdouble z); void glTranslatef(GLdouble x,   GLdouble y,   GLdouble z); 参数说明:x,y,z:分别指定沿x,y,z轴方向的平

[转载]详解OpenGL的坐标系、投影和几何变换

详解OpenGL的坐标系.投影和几何变换 转载http://blog.csdn.net/blues1021/article/details/51535398# OPengl的渲染流程是先全部设置好数据和状态,GL_MODELVIEW是将当前要变换的空间向量和模型视图矩阵当前最顶矩阵(会乘以摄像机变换乘投影矩阵的矩阵得最终变换矩阵)关联存储好包括状态设置,提交渲染时候glflush才会提交渲染数据和命令. glPushMatrix()和glPopMatrix()的配对使用目的是方便得到需要变换的最

OpenGL一些函数详解(二)

OpenGL ES顶点数据绘制技巧 在OpenGL中,绘制一个长方体,需要将每个顶点的坐标放在一个数组中.保存坐标时有一些技巧(由于字母下标不好表示,因此将下标表示为单引号,如A1将在后文中表示为A' ): (1)将对立面坐标保存在相邻的位置,如坐标的保存顺序为:前面(A'ABB'),后面(D'DCC'),上面(D'A'B'C'),下面(DABC),左面(D'A'AD),右面(C'B'BC).因为对立面的坐标除了其垂直的那根轴的坐标相反以外,其他坐标值一样:如前面和后面(垂直于z轴),x和y的坐

openGL点精灵PointSprite详解: 纹理映射,旋转,缩放,移动

第一,什么是点精灵 openGL的图形由顶点构成,以后利用顶点进行纹理的映射.点精灵就是,一个顶点被当作一个精灵来处理.特别之处就是,一个顶点也可进行纹理贴出.例如,原来是个顶点构成的一个矩形,现在一个顶点就可以完成了.瞬间我们就可以想想,粒子效果,那些云雾水流火花什么的用了点精灵,就可以瞬间减少3个顶点的计算,glDrawArrays使用GL_POINT就可以了,完全也不需要什么顶点索引了.这是非常诱人的效率. 第二,点精灵的局限 一个顶点缩放都必须是矩形.并且大小的最大最小值是有范围的,每个

NVIDIA Jetson TK1学习与开发(八):图文详解OpenGL在Jetson TK1上的安装和使用

图文详解OpenGL在Jetson TK1上的安装和使用 1.入门介绍与资源推介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库. OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khron

【OpenGL】详解第一个OpenGL程序

写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下.搞到最后都不知道自己在干嘛,更有可能因为某一步的顺序错误导致最后渲染出错,又或者觉得记下这些操作的顺序是非常烦人的一件事.那么,OpenGL为什么会长成这个样子呢?这篇文章旨在通过一个最简单的OpenGL程序开始,让我们能够"看懂"它,"记住"这些操作顺序. 我们先来解

# OpenGL常用函数详解(持续更新)

OpenGL常用函数详解(持续更新) 初始化 void glutInit(int* argc,char** argv)初始化GULT库,对应main函数的两个参数 void gultInitWindowSize(int witth,int height)指定GULT窗口产生的窗口的大小 void gultInitWindowsPosition(int x,int y)指定窗口产生的位置,以像素为单位,默认在左上角 void gultInitDisplayMode(unsigned int mod

视口(viewport)原理详解之第一部分

在这篇文章中,我将解释viewports和元素width是如何工作的,比如html元素.  window和 screen. 这篇文章主要针对桌面浏览器,但它的部分和移动设备中的结论也比较类似,所以也是为下篇移动端viewports详解做准备. 一.设备像素和CSS像素 设备像素提供了我们操作设备的一个正规的分辨率,可以用screen.width/height获得. 如果你给某个元素宽度设为128px,设备宽度1024px,默认浏览器最大化,这事,元素将占据屏幕宽度的1/8.如果用户缩放,那么这个

Android GLSurfaceView用法详解(二)

输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTest; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.conte