【学习OpenGL】(二)——绘制矩形(视口与裁剪区)
2018-02-07 15:42
483 查看
绘制矩形
在前面第一个创建窗口的程序的基础之上,添加绘制矩形的函数#include <gl/glut.h> void RenderScene(void) { // 用当前的清除颜色清除窗口 glClear(GL_COLOR_BUFFER_BIT); // 把绘图颜色设置为红色 // R G B glColor3f(1.0f,0.0f,0.0f); // 用当前颜色绘制一个填充的矩形 glRectf(-25.0f, 25.0f, 25.0f, -25.0f); // 刷新绘图命令 glFlush(); } // 设置渲染状态 void SetupRC(void) { // 把清除颜色设置为蓝色 glClearColor(0.0f, 0.0f,1.0f, 1.0f); } // 当窗口改变大小时 void ChangeSize(GLsizei w, GLsizei h) { GLfloat aspectRatio; // 防止被0除 if(h == 0) { h = 1; } // 把视口设置为窗口大小 glViewport(0, 0, w, h); // 重置坐标系统 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 建立裁剪区域(左、右、底、顶、近、远) aspectRatio = (GLfloat)w / (GLfloat)h; if(w <= h) { glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0); } else { glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main() { glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutCreateWindow("GLRect"); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); SetupRC(); glutMainLoop(); }
运行结果:
绘制矩形
glColor3f(1.0f,0.0f,0.0f);
把当前的绘图颜色设置为红色,该函数设置的是图形的填充颜色,而不是窗口的背景色。
glRectf(-25.0f, 25.0f, 25.0f, -25.0f);
glRectf函数的四个参数表示了两个坐标对,
前面两个参数为(X1,Y1),表示矩形的左上角,
后面两个参数为(X2,Y2),表示矩形的右下角。
窗口的缩放
glutReshapeFunc(ChangeSize);
在所有的窗口环境中,用户都可以在任何时候改变窗口的大小。当窗口大小被改变时,窗口通常会作出响应,根据新的窗口的大小重新绘制它的内容。
设置视口
glViewport(0, 0, w, h);
窗口:OpenGL里面所谓的窗口就是我们创建出来的窗口,也叫做屏幕窗口,我们可以在这整个窗口里面绘图。它是以像素为单位进行度量的。
视口:而视口则是窗口的一个子区域,通过设置视口就可以把绘图区域限定为窗口的一个子区域,而这个子区域的别名就叫做视口。即在窗口中可以见到或可以用来绘图的部分。它可以和窗口等大,也可以比窗口大或者小。一般设置视口等于窗口,只有绘制在视口区域中的图形才能被显示,如果图形有一部分超出了视口区域,那么那一部分是看不到的。通过glViewport()函数设置。在本程序中,设置视口区域大小等于窗口区域大小。
定义视口的函数是
void glViewport(Glint x,GLint y,GLsizei width,GLsizei height);其中x是指视口开始位置距离窗口左边的距离(以像素计),y是视口开始位置距离窗口底边的距离(以像素计),width视口的宽度(以像素计),height视口的高度(以像素计)。
X,Y参数指定了窗口内部视口的左下角,width与height参数指定了视口的大小。
设置裁剪区域
//重置坐标系统 glMatrixMode(GL_PROJECTION); //切换为透视投影矩阵 glLoadIdentity(); //将透视投影矩阵转换为单位矩阵 // 建立裁剪区域(左、右、底、顶、近、远) aspectRatio = (GLfloat)w / (GLfloat)h; if(w <= h) { glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0); } else { glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0); } glMatrixMode(GL_MODELVIEW); //切换为平行投影矩阵 glLoadIdentity(); //将平行投影矩阵转换为单位矩阵
一般会保证与窗口的纵横比是一致的,所以得设置一个变量aspectRatio。
裁剪区域:裁剪区就是我们画图是所用的逻辑区域,他用的是逻辑坐标,即在视口中让你看到的图形,即显示出来的那部分。就是视口矩形区域的最小最大x坐标(left,right)和最小最大y坐标(bottom,top),而不是窗口的最小最大x坐标和y坐标。通过glOrtho()函数设置,这个函数还需指定最近最远z坐标,形成一个立体的裁剪区域。
相关文章推荐
- OpenGL学习进程(5)第三课:视口与裁剪区域
- OpenGL2.0学习笔记【二】——(第二章)矩形的绘制
- opengl学习笔记2-2-矩形绘制
- opengl学习笔记二之绘制一个矩形
- 从分析blender轮廓提取技术中学习opengl如何绘制三维模型轮廓
- LearnOpenGL学习笔记2:绘制基础图形
- OpenGL入门示例2——黑色背景绘制绿色旋转矩形
- DirectX 3D_基础之模型表示 顶点格式 三角形 索引 虚拟摄像机 投影窗口 绘制流水线 局部坐标系 观察坐标系 世界坐标系 背面消隐 光照 裁剪 投影 视口变换 光栅化
- 学习OpenGL(三)绘制螺旋状图形
- OpenGL学习二:状态管理和绘制几何物体
- OpenGL学习十:视口,正投影,透视投影
- OpenGL学习二十四:绘制像素,位图,图像
- 【OpenGL】窗口,视口,裁剪区
- OpenGL学习笔记 (2) —— 绘制多边形
- opengl 屏幕 窗口 视口 裁剪区
- OpenGL入门之绘制矩形
- Canvas学习:绘制矩形
- OpenGL学习(二) 状态管理和绘制几何物体
- 【cocos2d-x 2.x 学习与应用总结】14: 自定义shader绘制混合颜色的矩形
- OpenGL学习日记-2014.11.26--简单裁剪