OpenGL学习(一)一个简单的绘制矩形程序

一段简单的绘制正方形的程序:
#include <gl/glut.h>

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5,-0.5);
	glVertex2f(-0.5,0.5);
	glVertex2f(0.5,0.5);
	glVertex2f(0.5,-0.5);
	glEnd();

	glFlush();
}

int main(int argc,char**argv)
{
	glutInit(&argc,argv);
	glutCreateWindow("test");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

运行之后可以得到这样的结果

上述程序中main()负责OpenGL的初始化,display()函数定义了要绘制的实体。

首先看main()函数

void glutInit(int* argc,char** argv)

初始化glut,应在其他glut函数和OpenGL函数之前调用。接受main函数的参数。

int glutCreateWindow(char* title)

在屏幕上创建一个窗口,该窗口的标题有title给出。

void glutDisplayFunc(void(*func(void)))

函数func()在每次需要对窗口重绘时被调用。

void glutMainLoop();

使程序进入无限事件处理循环。

在看看display()函数里面的内容

void glClear(GLbitfield mask)

清空mask所指示的所有缓存中的位,得到我们想要的指定的结果。

void glBegin(GLenum mode)

二者之间指定所要绘制的顶点。mode可取GL_POINTS、GL_LINES或GL_POLYGON等等

void glEnd()

glVertex<2,3,4><b i f d>() 描述顶点。可以有多种形式,也可以用向量,

void glFlush()

强制执行所有OpenGL命令。绘图操作后必须加上这一句。

修改GLUT中的默认值:

void glutInitDisplayMode(unsigned int mode)

设置窗口属性为mode模式,mode取值选项为如颜色模式(GLUT_RGB,GLUT_INDEX)和颜色缓存的缓     存模式(GLUT_SINGLE、GLUT_DOUBLE),默认是RGB和SINGLE。

void glutInitWindowSize(int w,int h)  设置窗口的厨师宽度和高度

void glutInitWindowPosition(int x,int y) 设置窗口的左上角相当于屏幕左上角的位置。

颜色的设置:

void glColor3<b i f d....>(r ,g ,b)

void glColor3<b i f d....>v(color)              //设置绘制颜色

void glClearColor(r ,g ,b, a)      //指定屏幕清空颜色,设置后需调用glClear()方能生效

OpenGL和GLUT坐标系统的差异

OpenGL中,x轴和y轴的正方向分别是向上和向右,GLUT中则是向下和向右。

二维取景

void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)

指定一个二维剪裁区域,左下角坐标为(left,bottom),右上角坐标为(right,top)。位于窗口内的对象是可见的,落在窗口之外的对象则不可将,我们称其“被剪裁”。

视口

用视口来限制OpenGL仅在屏幕窗口的任一部分进行绘制。

void glViewport(GLint x,GLint y,GLsizei w,GLsizei h)

将视口的宽度设为w,高度设为h,坐下角坐标为(x,y)。

坐标系统与变换

对象坐标系或世界坐标系:开发人员使用的正是这种坐标系。可自己选定何种单位

窗口坐标系或屏幕坐标系:单位为像素。由物理显示器的属性和显示器的区域两方面决定。

OpenGL中的坐标系变换由两个矩阵决定:

1、模糊视图矩阵        2、投影视图矩阵

函数gluOrtho2D()用于为二维应用程序指定一个投影矩阵

设置这两种矩阵的典型步骤包括:

1、指定我们希望修改的矩阵。

2.将矩阵重置为单位矩阵,

3、修改当前矩阵为用户所期望的矩阵。

glMatrixMode(GL_PROJECTION)

glLoadIndentity();

gluOrtho2D(-1.0,1.0,-1.0,1.0);

完善开始的那段程序

#include <gl/glut.h>

void init()
{
	glClearColor(0.0,0.0,0.0,0.0);      //指定屏幕背景为黑色

	glColor3f(1.0,1.0,1.0);             //设置绘制颜色为白色

	glMatrixMode(GL_PROJECTION);       //指定希望修改的矩阵为投影矩阵
	glLoadIdentity();                  //重置为单位矩阵
	gluOrtho2D(-1.0,1.0,-1.0,1.0);     //设置二维剪裁区域,左下角坐标为(-1,1),右上角坐标为(1,1)
}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);         //清理屏幕颜色为我们指定的颜色

	glBegin(GL_POLYGON);              //绘制模式为凸多边形
	glVertex2f(-0.5,-0.5);
	glVertex2f(-0.5,0.5);
	glVertex2f(0.5,0.5);
	glVertex2f(0.5,-0.5);             //指定绘制的四个顶点
	glEnd();                          

	glFlush();                       //强制以上绘图操作执行
}

int main(int argc,char**argv)
{
	glutInit(&argc,argv);                           //初始化glut
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //设置窗口模式为单缓冲和RGB模式
	glutInitWindowSize(500,500);                    //设置窗口大小
	glutCreateWindow("test");                       //设置窗口标题
	glutDisplayFunc(display);                       //设置绘图回调函数
	glutMainLoop();                                 //开始循环,等待响应
	init();
	return 0;
}
得到如下结果:

时间: 2024-10-11 17:57:21

OpenGL学习(一)一个简单的绘制矩形程序的相关文章

利用java的Socket实现一个简单hello/hi聊天程序

利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序.在这个程序里,我学习到了怎么用socket套接套接字来进行编程.简单理解了一些关于socket套接字和底层调用的关系.关于java的封装思想,我学会了一些东西,java里真的是万物皆对象.还学到了一点多线程的知识. TCP 在这里,不得不先介绍以下TCP.TCP是传输层面向连接的协议.提供了端到端的进程之间的通信方式.TCP在通信之前要先建立连接.这里我们称这个建立连接的

用L脚本语言开发一个简单的局域网聊天程序

#scp #这是一个简单的局域网聊天程序的例子 定义:字符串,string1 定义:字符串,string2 #addr1是对方的地址 #addr2是自己的地址 #如果addr1和addr2相同,就是自己和自己聊天 定义:地址,addr1,127.0.0.1,27015 定义:地址,addr2,127.0.0.1,27015 定义:整数,字节数,0 #在自己的UDP端口上监听 定义:网络连接,conn2,UDP 监听:conn2,addr2 #连接对方的UDP端口 定义:网络连接,conn1,UD

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcarsgroup.h // 07-汽车展示(高级) // // Created by apple on 14-5-28. // Copyright (c) 2014年 itcase. All rights reserved. // #import <Foundation/Foundation.h> @

一个简单 的Shell 显示程序

#!/bin/bash clear declare FirstName Greeting   Greeting="Hello ," echo "" echo "Enter Your First Name:" read FirstName echo "$Greeting $FirstName" 首先   vim  Print  回车 然后   i   进入插入状态 编辑以上代码,Esc 键回车 输入   chmod  711 P

编写一个简单的jdbc例子程序

1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class Base { 10 11 public static void main(String[] args) th

一个简单的键盘钩子程序

实现适时监视键盘,并将按键信息保存在TXT文件中的程序       Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能.钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取.启动和关闭应用程序的消息等.本文在VC6编程环境下实现了一个简单的键盘钩子程序,并对Win32全局钩子的运行机制.Win

0915-----Linux设备驱动 学习笔记----------一个简单的字符设备驱动程序

0.前言 研究生生活一切都在步入正轨,我也开始了新的学习,因为实在不想搞存储,所以就决定跟师兄学习设备驱动,看了两星期书,终于有点头绪了,开始记录吧! 1.准备工作 a)查看内核版本 uname -r b)安装内核源码树(http://www.cnblogs.com/Jezze/archive/2011/12/23/2299871.html) 在www.linux.org上下载源码编译,这里是.xz格式,需要安装解压工具,xz-utils: 解压方法示例:xz -d linux-3.1-rc4.

Hibernate学习——建立一个简单的Hibernate项目

最近老师让做个web小应用,大三的时候学习过一点J2EE的东西,也做过一些web相关的XXX管理系统,都是用servlet,jsp这些完成的,虽然勉强能够完成任务,但其中各种代码掺杂在一起,不好看而且维护起来也很麻烦,出了一点问题要调试好久才能解决.这次打算让自己多学一点东西,在项目的架构上我使用了struts2实现了多层代码的分离,在数据库方面,因为以往的经历都需要对连接数据库进行一个封装,里面包含有数据库的连接,记录的添加,查询,修改和删除等操作,每次使用的过程中都需要先实现一个连接对象然后

WCF学习——构建一个简单的WCF应用(一)

本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WCF本质上提供一个跨进程.跨机器.跨网络的服务调用.在本例中,客户端和WCF应用服务通过运行在同一台机器上的不同进程模拟. 步骤一.构建整个解决方案 1.创建一个空白的解决方案 2.添加四个项目和引用及关系  Service.Interface  用于定义服务契约的类库项目,引用WCF核心程序集Sys