OpenGL(三)之基础绘制篇

本文将会介绍使用OpenGL进行点,线,三角形乃至多边形的绘制,,,

下图是采用不同类型的图形效果

一、点

点”是一切的基础。 OpenGL提供了一系列函数指定一个点。它们都以glVertex开头,后面跟一个数字和1~2个字母。

例如:

glVertex2d

glVertex2f

glVertex3f

glVertex3fv 等等。

数字表示参数的个数:2表示有两个参数,3表示三个,4表示四个。

字母表示参数的类型:

s表示16位整数(OpenGL中将这个类型定义为GLshort),

i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),

f 表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),

d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。

v表示传递的几个参数将使用指针的方式,见下面的例子。

这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:

(一)glVertex2i(1, 3);

(二)glVertex2f(1.0f, 3.0f);

(三)glVertex3f(1.0f, 3.0f, 0.0f);

(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);

(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};

glVertex3fv(VertexArr3);

OpenGL的很多函数都是采用这样的形式。

OpenGL中描述一个面(线、点)的方法是glBegin/glEnd命令组:
glBegin(形状);
  glVertex(顶点1);
  glVertex(顶点2);
  ……
glEnd();

void glPointSize(GLfloat size);

size必须大于0.0f,默认值为1.0f,单位为“像素”。

注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。

下面是一段示例代码:

 1 //GLUT的头文件
 2 //本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含
 3 #include <glut.h>
 4
 5 void myDisplay(void)
 6
 7 {
 8     //表示清除颜色
 9     glClear(GL_COLOR_BUFFER_BIT);
10
11         //设置点的大小
12     glPointSize(5.0f);
13
14     glBegin(GL_POINTS);
15        glVertex2f(0.0f, 0.0f);
16        glVertex2f(0.5f, 0.5f);
17     glEnd();
18
19     //保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)
20     glFlush();
21
22 }
23
24 //带命令行参数的main函数
25 int main(int argc, char *argv[])
26
27 {
28     glutInit(&argc, argv);
29
30     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
31
32     glutInitWindowPosition(100, 100);
33
34     glutInitWindowSize(400, 400);
35
36     glutCreateWindow("OpenGL画点程序");
37
38     glutDisplayFunc(&myDisplay);
39
40     glutMainLoop();
41
42     return 0;
43
44 }

效果如图

二、线

直线可以指定宽度

void glLineWidth(GLfloat width);

其用法跟glPointSize类似。

与OpenGL画点函数十分类似,不同在于glBegin()中的符号常量。
  使用图元常量GL_LINES可连接每一对相邻定点而得到一组直线段。

 
1  glBegin(GL_LINES);
2       glVertex2iv (p1);
3       glVertex2iv (p2);
4       glVertex2iv (p3);
5       glVertex2iv (p4);
6       glVertex2iv (p5);
7  glEnd();

  上述代码可以画出线段p1-p2和p3-p4。

示例:

  使用GL_LINE_STRIP则可以获得折线,如果需要封闭的折线则需要重复某些点坐标。

1   glBegin(GL_LINE_STRIP);
2       glVertex2iv (p1);
3       glVertex2iv (p2);
4       glVertex2iv (p3);
5       glVertex2iv (p4);
6       glVertex2iv (p5);
7   glEnd();

  上述代码画出折线p1-p2-p3-p4-p5。

示例:

  生成封闭折线的常量是GL_LINE_LOOP

 
1  glBegin(GL_LINE_LOOP);
2       glVertex2iv (p1);
3       glVertex2iv (p2);
4       glVertex2iv (p3);
5       glVertex2iv (p4);
6       glVertex2iv (p5);
7  glEnd();

  上述代码画出封闭折线p1-p2-p3-p4-p5-p1。

  • 示例代码
 1 #include <GL/glut.h>
 2
 3 void init(){
 4   glClearColor (0.0, 0.0, 0.0, 0.0);
 5   glMatrixMode (GL_PROJECTION);
 6   gluOrtho2D (0.0, 200.0, 0.0, 150.0);
 7 }
 8
 9 void display(){
10   int p1 [] = {110, 50};
11   int p2 [] = {20, 0};
12   int p3 [] = {55, 80};
13   int p4 [] = {90, 0};
14   int p5 [] = {0, 50};
15
16   glClear (GL_COLOR_BUFFER_BIT);
17
18
19   glBegin(GL_LINE_LOOP);
20   glVertex2iv(p1);
21   glVertex2iv(p2);
22   glVertex2iv(p3);
23   glVertex2iv(p4);
24   glVertex2iv(p5);
25   glEnd();
26
27   glFlush();
28 }
29
30 void main(int argc, char *argv[])
31 {
32   glutInit(&argc, argv);
33   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
34   glutInitWindowSize(400, 300);
35   glutCreateWindow("Five-Pointed Star");
36   init();
37   glutDisplayFunc(display);
38   glutMainLoop();
39 }

  运行结果如下:

大家可自行比较三张截图了解不同。

三、几何物体

1.三角形

画三角形以不同顶点的连接有三种方式,但都是内部填充的方式

  1. GL_TRIANGLES如同GL_LINES一样,第一个三角形的点是V0,V1,V2,第二个则是V3,V4,V5,即是一个3的倍数。不然最后的一个或两个点不显示。
  2. GL_TRIANGLE_STRIP的填充方式犹如放弃前一个顶点,如第一个三角形V0,V1,V2,第二个则是V1,V2,V3(舍弃V0)
  3. GL_TRIANGLE_FAN的填充方式将永远以V0为起始点,如第一个三角形为V0,V1,V2,第二个则是V0,V2,V3

这里就不自己画了,上面的例子已经可以充分表达了

2.四边形

有两种方式

其区别与画三角形相同,只不过STRIP是隔了2个顶点

3.多边形

GL_POLYGON用于画多边形

多边形无法绘制非凸多边形,如下图

但可以用glPolygonMode函数改变多边形绘制的模式,绘制其轮廓

这些以后再详细讨论

时间: 2024-10-04 00:04:28

OpenGL(三)之基础绘制篇的相关文章

C#基础知识篇(三)-----------C#笔记

一.方法 1. 什么叫做方法? 方法就是对一段代码的重用的机制. 2. 方法的定义: [访问修饰符] [static] 返回值类型 方法名() { 方法体; } 注意:用[]修饰的都是可选的. 3. 需要注意的细节: 命名规则:方法名开头大写,参数名开头小写,参数名.变量名要有意义. 4. 方法的参数: 1>在方法名后面括号内定义变量就叫做定义这个方法的参数(形参). 2>在方法()中我们定义多个参数时,参数之间用逗号分隔,不管参数之间的类型是否相同,都不能像定义同类型的多个变量时:如:int

Bombe 【Linux】鸟哥的Linux私房菜基础学习篇整理(三)

1. gzip [-cdtv#] filename:压缩.参数:-c:将压缩的数据输出到屏幕上,可通过数据重定向进行处理:-d:解压缩的参数:-t:可以用来检验一个压缩文件的一致性,查看文件有无错误:-v:可以显示出原文件/压缩文件的压缩比等信息:-#:压缩等级,1最快(压缩比最差),9最慢(压缩比最好),默认6. 2. zcat *.gz:读取gzip压缩文件. 3. bzip2 [-cdkzv#] filename:压缩.参数:-c:将压缩过程中产生的数据输出到屏幕上:-d:解压缩的参数:-

《nodejs+gulp+webpack基础实战篇》课程笔记(三)--webpack篇

webpack引入 前面我们简单学习了gulp,这时一个前端构建框架---webpack产生了(模块打包) 它能帮我们把本来需要在服务端运行的JS代码,通过模块的引用和依赖打包成前端可用的静态文件.(这里有需要了解一下CommonJS规范,具体请自行查看http://commonjs.org). 安装webpack: npm install -g wabpack //这里我们采用全局安装,保证每个项目中都能使用到 设置配置文件:  在项目目录下,新建一个webpack.config.js文件 m

基于C/S架构的3D对战网络游戏C++框架 _03客户端详细设计与OpenGL、Qt基础

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

android openGL ES2 一切从绘制纹理开始

纹理,在openGL中,可以理解为加载到显卡显存中的图片.Android设备在2.2开始支持openGL ES2.0,从前都是ES1.0 和 ES1.1的版本.简单来说,openGL ES是为了嵌入设备进行功能剪裁后的openGL版本.ES2.0是和1.x版本不兼容的,区别和兼容性参见android 官方文档. 首先,android使用openGL提供了特殊的view作为基础叫做GLSurfaceView.我们的view需要继承GLSurfaceView.如下简单示例: public class

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

C#基础知识篇(五)-----------C#笔记

一.值类型和引用类型 1>值类型和引用类型将我们学过的数据类型划分成了两部分. 划分的依据是不同类型的数据在内存中(堆栈)存储的结构不同. 2>值类型:所有的数值类型:long int short byte ulong uint ushort sbyte decimal duoble float char bool 枚举 结构 3>引用类型:string,arry(数组),类(class) 4>不管是值类型还是引用类型赋值都是将数据copy一份将副本赋给变量,不同的是值类型拷贝的是

SQLAlchemy 教程 —— 基础入门篇

SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLAlchemy 进行简单了 CURD 操作及使用 Faker 生成测试数据. 1.2课程知识点 学会用 SQLALchemy 连接数据库(MySQL, SQLite, PostgreSQL), 创建数据表: 掌握表数据之间一对一,一对多及多对多的关系并能转化为对应 SQLAlchemy 描述: 掌握使

C#基础知识篇(四)-----------C#笔记

一.类 1. 什么叫做类? 类是具有相同特征的一类事物统称.所以类是一种抽象,即不是一个实体(我们把类看做模板). 2. 什么叫做对象? 对象是根据类的模板创造出来的一个实体,它具有类里所有的特征,一个也多不得,一个也少不得.少了就不叫这个类的成员了,多了也不是!假如张三有变身这个功能,那么张三就不属于人. 记住对象是根据模板创建的,模板有什么它就有什么,不会多也不会少! 3. 什么叫做字段(或者是成员变量)? 我们把定义在方法的外面,类的里面(即:类中)的变量称之为字段或者说是成员变量. 4.