OpenGL编程(二)绘制矩形
上次只是创建了一个简单的窗口,把背景颜色修改为蓝色(默认是黑色),并没有向窗口添加任何图形。这次在上次代码的基础上往窗口中添加一个矩形,设置矩形的颜色,大小等。
1、添加矩形
在(参考上次代码)renderScene()函数里添加glRectf(-0.5f, -0.5f, 0.5f, 0.5f);就能在窗口上绘制一个矩形,默认的颜色是白色,如果需要修改颜色,在绘图前使用glColor3f函数来修改绘图颜色,例如glColor3f(1.0f, 0.0f, 0.0f);把绘图颜色改成红色。
完整代码:
#include <windows.h>
#include <gl/glut.h>
//Rect.cpp
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲池
glColor3f(1.0f, 0.0f, 0.0f); //设置绘图颜色
glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //绘制矩形
glFlush(); //执行OpenGL指令列表中的指令
}
void main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式
glutInitWindowSize(500, 500); //设置窗口大小
glutInitWindowPosition(200, 200); //设置窗口在屏幕上的位置
glutCreateWindow("矩形"); //创建窗口并给出标题
glutDisplayFunc(renderScene); //注册显示窗口时回调函数renderScene
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); //使用蓝色清空背景底
glutMainLoop(); //消息循环(处理操作系统等的消息,例如键盘、鼠标事件等)
}
结果:
2、解释glRectf(-0.5f, -0.5f, 0.5f, 0.5f)里的坐标
在这里第1-4个参数分别是x1, y1, x2, y2表示矩形中左下角和右上角的坐标。可为什么坐标的值是(-0.5, -0.5)和(0.5, 0.5)呢?开始我也很纳闷,根据画图的效果,绝对不是绝对像素点坐标,窗口的坐标系也不是左下角或坐上角为原点。经过修改坐标的值,终于弄明白了坐标用的是相对窗口位置的坐标,且窗口的中心是坐标系原点,由左向右是X轴的正方向,由下向上是Y轴的正方向。如下图所示:
3、怎样解释函数glRectf里的参数值大于1的情况
按照上面的解释,glRectf里的参数值取值范围是0.0f-1.0f。可是看到书上某些地方给的代码中存在glRectf(100.0f, 150.0f, 150.0f, 100.0f);传入的参数值竟然比1大。可当我把上面代码中的参数值改大于1时,绘制矩形就会失败。后来发现是函数glOrtho造成的。该函数的用途是设置或修剪空间的范围。句法为:void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);left表示最左边的坐标,right表示最右边的坐标,bottom表示最下边的坐标,top表示最上边的坐标,near表示最前边的坐标,far表示最后边的坐标。设置好坐标后,各个顶点的坐标就是对于输入参数的值。假设我们是正对着Z轴,不考虑Z轴的情况,例如:glOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0, -1.0);我们面对的平面从坐向右是X轴的正方向,从下到上是Y轴的正方向,左下角是原点(0, 0);右下角的坐标是(300.0, 0.0),左上角的坐标是(0.0, 300.0);右上角的坐标为(300.0, 300.0)。即显示窗口X方向的的大小为300个单位,Y方向也一样。如果要画一个跟上面效果的图,glRectf函数应该改为glRectf(100.0f, 100.0f, 200.0f, 200.0f); //绘制矩形,即表示点(100.0f,100.0f)和点(200.0f,200.0f)之间的矩形。坐标系如下图:
正如上图所示函数glRectf里的坐标与glOrtho的坐标对于。
与上面的效果图一样,修改后的代码如下:
#include <windows.h>
#include <gl/glut.h>
//Rect.cpp
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲池
glColor3f(1.0f, 0.0f, 0.0f); //设置绘图颜色
glRectf(100.0f, 100.0f, 200.0f, 200.0f); //绘制矩形
glFlush(); //执行OpenGL指令列表中的指令
}
void main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式
glutInitWindowSize(500, 500); //设置窗口大小
glutInitWindowPosition(200, 200); //设置窗口在屏幕上的位置
glutCreateWindow("矩形"); //创建窗口并给出标题
glutDisplayFunc(renderScene); //注册显示窗口时回调函数renderScene
glOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0, -1.0);
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); //使用蓝色清空背景底
glutMainLoop(); //消息循环(处理操作系统等的消息,例如键盘、鼠标事件等)
}
OpenGL编程(二)绘制矩形的更多相关文章
- OpenGL编程(三)让矩形动起来
上次实现了在窗口中添加一个了一个矩形.这次的任务是在上次代码的基础上,让那个矩形动起来. 1.思路 要看到动态的效果,首先添加一个定时器,规定的时间刷新一次窗口:不断修改矩形的位置,使其在时间轴上达到 ...
- OpenGL学习——绘制矩形
接下来稍微扩展一步,绘制矩形,即两个拼在一起的三角形. 引入一个概念, EBO Element Buffer Object 元素缓冲对象, EBO用于存放描述“顶点绘制顺序”的对象. 外注:创建VS ...
- Javascript高级编程学习笔记(86)—— Canvas(3)绘制矩形
绘制矩形 矩形是唯一一种可以直接在2D上下文中绘制的形状. 与矩形有关的方法包括: fillRect() strokeRect() clearRect() 上述方法都接收四个参数: 绘制矩形的 X 坐 ...
- 用MFC实现OpenGL编程
一.OpenGL简介 众所周知,OpenGL原先是Silicon Graphics Incorporated(SGI公司)在他们的图形工作站上开发高质量图像的接口.但最近几年它成为一个非常优秀的开放式 ...
- Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤
http://blog.csdn.net/vagrxie/article/details/4602961 Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤 wri ...
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章. 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝 ...
- Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形
来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
这是两个相关的程序,前者是后者的基础.实际上前一个程序也是在前面博文的基础上做的修改,请参考<在OpenCV中利用鼠标绘制直线> .下面贴出代码. 程序之一,在OpenCV中利用鼠标绘制矩 ...
随机推荐
- ubuntu16.04安装破解pycharm
分两步,首先安装jdk,然后安装并破解pycharm 一.安装jdk 参考:http://blog.csdn.net/yebhweb/article/details/55098189 下载jdk1.8 ...
- C#中的CSP(Communicating sequential processes)
说起Golang(后面统称为Go),就想到他的高并发特性,在深入一些就是 Goroutine.在大家被它优雅的语法和简洁的代码实现的高并发程序所折服时,其实C#/.NET也可以很容易的做到.今天我们来 ...
- 几个常用ORACLE运维监控的SQL语句
1.消耗CPUSELECT a.CPU_TIME, --CPU时间 百万分之一(微秒) a.OPTIMIZER_MODE,--优化方式 a.EXEC ...
- 把一串数字表示成千位分隔形式——toLocaleString()
听说你用什么正则?我这有个骚操作了解下.. toLocaleString() 方法可把一个 Number 对象转换为本地格式的字符串. ().toLocaleString('en-US') " ...
- [雅礼NOIP2018集训 day1]
现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了 T1: 题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值 数据范围当然是你暴力写不过 ...
- JavaScript学习记录一
title: JavaScript学习记录一 toc: true date: 2018-09-11 18:26:52 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- vue 组件来回切换时 记住上一个组件滚动位置(keep-alive)
记住组件滚动状态: 使用场景:从某列表组件进入详情页,在返回的时候需要保留列表组件状态,包括滚动的高度.这个时候需要keep-alive配合. 方法一:如下情况导航在做普遍用法.前提是使用keep-a ...
- vue2 filter过滤器的使用
本章主要讲vue2的过滤器的使用 1.先介绍下vue1与vue2的filter区别,也就是vue2更新的地方 a: 2.0将1.0所有自带的过滤器都删除了,也就是说,在2.0中,要使用过滤器,则需要我 ...
- P3809 【模版】后缀排序
题目背景 这是一道模版题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...
- 使用rman恢复数据小结
恢复前提有数据备份 以 alter database open resetlogs 开机以后多要做一次全备(以前的备份失效了) 恢复参数文件: restore spfile from '/home/o ...