OpenGL基础教程

文章目录

  • OpenGL基础教程
    • 一、OpenGL的组成
      • 1、OpenGL库
      • 2、OpenGL实用库
      • 3、OpenGL辅助库
    • 二、OpenGL的工作顺序
    • 三、OpenGL的基本语法
      • 1、命名规则
      • 2、数据类型
    • 三、OpenGL程序实例
      • 1、头文件包含
      • 2、窗口管理
    • 四、OpenGL程序的基本结构
      • 1、初始化
      • 2、设置取景模式
        • 1)平行投影:`glOrtho()`
        • 2)透视投影:gluPerspective()
        • 3)视口变换:`void glViewport();`
        • 4)`glOrtho()`和`glViewport()`的关系
      • 3、几何变换/光照处理
    • 五、OpenGL程序实例——绘制图形

一、OpenGL的组成

1、OpenGL库

  • 包括115个基本函数

  • 函数以gl开头

    例:glColor3f(), glTranslate3f().

  • 完成图元的定义、几何变换、投影等功能

2、OpenGL实用库

  • 实用函数43个
  • 函数以glu开头
    例:gluPerspective();
  • 完成更高层的图形处理如曲线曲面的生成、图象操作

3、OpenGL辅助库

  • 包括函数31个
  • 函数以aux开头
    例:auxInitWindow();
  • 主要用于窗口管理

二、OpenGL的工作顺序

  • 构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述
  • 在三维空间上放置对象,选择有利的场景观察点。
  • 计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。
  • 光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。另外,也可能执行消隐,以及对象素的操作。

三、OpenGL的基本语法

1、命名规则

  • OpenGL函数都遵循一个命名约定,即采用以下格式:
    <库前缀><根命今><可选的参数个数><可选的参数类型>
    例如函数glColor3f(...), gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。

  • void glVertex3fv(Glfloat *vertex)

    前缀:

    • gI,glu,aux,glut—该函数属于哪个函数库

    后缀:

    • 2,3,4 — 参数的维数
    • b,s,I,f,d,ub,us,ui — 参数的数据类型
    • v ---- 以数组方式传递参数

    函数名中的单词首写字母大写

2、数据类型

三、OpenGL程序实例

1、头文件包含

  • 利用OpenGL实现图形绘制,首先要引入OpenGL核心库以及其他需要使用的库的头文件。

  • GLUT保证了gl.h和glu.h被正确包含。

    #include <gl/glut.h>
    #include <windows.h>
    

2、窗口管理

  • 初始化(glutlnit)
  • 创建窗口(glutCreateWindow)
  • 设定窗口的显示模式(glutlnitDisplayMode)
  • 指定窗口的位置和大小(glutlnitWindowPosition和glutlnitWindowSize)
  • 指定窗口的显示内容函数(glutDisplayFunc)
  • 运行框架(glutMainLoop)
int main( int argc, char **argv)
{ glutInit( &argc, argv); // GLUT 初始化函数
// 设置窗口大小 (width, height)
glutInitWindowSize(400, 400);
// 设置窗口位置, 从左上角开始
glutInitWindowPosition(200, 100);
// 创建绘制窗口
glutCreateWindow( "Green Triangle");
// 设置绘制回调函数,把一个绘制函数的指针传给系统,
//系统会在需要重绘的时候自动来调用你提供的绘制函数
glutDisplayFunc(display);
init(); // 初始化
glutMainLoop(); // 进入GLUT的主消息循环,直到绘制窗口
// 被关闭时该行代码才执行完毕,进入下一行
return 0; // 程序退出
}

四、OpenGL程序的基本结构

1、初始化

第一部分是初始化部分:

  • 主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。

  • 这些状态一般都用函数glEnable(), glDisable(???)来设置,???表示特定的状态。

2、设置取景模式

第二部分设置观察坐标系下的取景模式。主要用到两个函数

1)平行投影:glOrtho()

void glOrtho(left,right,bottom,top,near,far);设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;

  • 设置一个长宽高一定的投影矩阵,通俗点讲就是设置摄影机所能照射的范围

  • 在一个漆黑的舞台上,如果舞台上的物体超出了这个范围那就显示不出来,只有刚好在摄影机照射的范围内才能完全显示。

  • 例如:工程图采用的是正交投影:

2)透视投影:gluPerspective()
  • void gluPerspective(fovy,aspect,zNear,zFar)
    设置投影方式为透视投影,其取景体积是一个截头锥体,在这
    个体积内的物体投影到锥的顶点。

    例如:火车道,感觉很远处会交于一处(Vanishing point)

3)视口变换:void glViewport();
  • void glViewport(left,top,right,bottom);设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示);
  • glViewport在默认情况下,视口被设置为占据打开窗口的整个像素矩形窗口大小和设置视口大小相同,所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换,在窗口中定义一个像素矩形,最终将图像映射到这个矩形中。例如可以对窗口区域进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图
#include "stdafx.h"
#include <math.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include "gl/glut.h“void myDisplay()
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);//画分割线,分成四个视见区  glViewport(0, 0, 400, 400);glBegin(GL_LINES);glVertex2f(-1.0, 0);glVertex2f(1.0, 0);glVertex2f(0.0, -1.0);glVertex2f(0.0, 1.0);glEnd(); //定义在左下角的区域  glColor3f(0.0, 1.0, 0.0);glViewport(0, 0, 200, 200);glBegin(GL_POLYGON);glVertex2f(-0.5, -0.5);glVertex2f(-0.5, 0.5);glVertex2f(0.5, 0.5);glVertex2f(0.5, -0.5);glEnd(); //定义在右上角的区域  glColor3f(0.0, 0.0, 1.0);glViewport(200, 200, 400, 400);glBegin(GL_POLYGON);glVertex2f(-0.5, -0.5);glVertex2f(-0.5, 0.5);glVertex2f(0.5, 0.5);glVertex2f(0.5, -0.5);glEnd();//定义在左上角的区域  glColor3f(1.0, 0.0, 0.0);glViewport(0, 200, 200, 400);  glBegin(GL_POLYGON);glVertex2f(-0.5, -0.5);glVertex2f(-0.5, 0.5);glVertex2f(0.5, 0.5);glVertex2f(0.5, -0.5);glEnd(); //定义在右下角  glColor3f(1.0, 1.0, 1.0);glViewport(200, 0, 400, 200);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);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("OpenGL程序");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;
}

4)glOrtho()glViewport()的关系

假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框把这个球体整个都装了进来。

如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;

glOrtho函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。
glViewport主要完成这样的功能。它负责把视景体截取的图像按照怎样的高和宽显示到屏幕上

  • 比如:如果我们使用glut库建立一个窗体:glutInitWindowSize(500, 500); 然后使用glutReshapeFunc(reshape);

    reshape代码如下:

    void reshape(int width, int height){glViewport(0, 0, (GLsizei)width, (GLsizei)height);glMatrixModel(GL_PROJECTION);glLoadIdentity();glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);....
    }
    

    这样是可以看到一个正常的球体的。

3、几何变换/光照处理

​ 第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。

五、OpenGL程序实例——绘制图形

  • 清除当前窗口的内容,以免影响绘图的效果

    void glClearColor (red, green, blue, alpha);

  • 给定当前屏幕的背景设置颜色,red, green, blue, alpha为RGBA颜色值.

    指定窗口背景色( glClearColor
    颜色管理,使用RGB颜色模型。一种颜色用红、绿、蓝三种颜色成分混合而成,每种颜色成分使用0.0到1.0之间的任意有效浮点数来表示颜色值。

接下来的内容参考OpenGL入门教程

OpenGL基础教程相关推荐

  1. [原]OpenGL基础教程(一)多边形绘制

    1.opengl开发环境搭建 参考http://brothergrup.iteye.com/blog/1602471 2.为三角形填充颜色: 填充颜色函数为glColor(3/4)*(r,g,b)  ...

  2. [原]OpenGL基础教程(二)多边形绘制

    上篇介绍了最基本的三角形绘制,本篇介绍如何使用索引的方式绘制多边行. 为什么要使用索引方式,总体来说提高性能.如何提高:使用顶点数组的好处是避免大量的函数调用.即避免每画一个顶点就调用1次glVert ...

  3. OpenGL ES基础教程,绘制三角形(补充,附代码)

    简介 OpenGL OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维亦可),是一个功能强大,调用方 ...

  4. Android基础教程pdf

    下载地址:网盘下载 内容简介  · · · · · · <Android基础教程>内容完整丰富,具有较强的通用性,读者都能通过<Android基础教程>快速学习Android开 ...

  5. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统, ...

  6. OpenGL基础46:切线空间

    到这里,关于OpenGL基础的了解要接近尾声了,上一个节点是<OpenGL基础25:多光源>.在此章之后,学习openGL的各种教程的同时,可以转战想要了解的渲染引擎,也可以去github ...

  7. OpenGL基础16:视角

    一.欧拉角 三种欧拉角: 俯仰角(Pitch):沿x轴旋转的角,从上往下看的角 偏航角(Yaw):沿y轴旋转的角,从左往右看的角 滚转角(Roll):沿z轴旋转的角(对于摄像机而言,一般不关心这个) ...

  8. DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【1】)

    目录 1.前言 2.本章代码简要说明 1.前言   经过了一系列比较枯燥的命令行式的"外篇"系列教程后,这一篇起回归主干,继续我们的D3D12之旅,本章就利用已经学习的assimp ...

  9. DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步

    目录 1.前言及本章内容提要 2.初识DirectXMath库 3.使用独立堆创建常量缓冲 4.理解管线状态对象 5.理解围栏同步 6.完整代码 1.前言及本章内容提要 经过了之前3篇教程的跨度有点大 ...

  10. iPhone 4与iPad开发基础教程

    iPhone 4与iPad开发基础教程 创造销售奇迹的经典著作 针对iOS SDK新特性全面改版 从这里,拥抱软件开发的未来 基本信息 原书名:Beginning iPhone 4 Developme ...

最新文章

  1. 用于Elasticsearch成绩单的Java客户端
  2. 到底谁在使用低代码?钉钉低代码用户画像:非IT人员占8成
  3. Apache开启Gzip压缩设置(转)
  4. Pandas知识点-Series数据结构介绍
  5. 除了随机还要进化——对Infinity进一步的想法
  6. 【Computer Organization笔记18】大实验讨论:控制器设计、指令流程表
  7. spring学习--引入外部文件,初始化属性
  8. urllib urllib2 自己用
  9. 国家java认证考试报名入口,值得一读!
  10. VMware Ubuntu 18.04 搭建个人Hustoj教程
  11. Matlab如何滤出高音,基于Matlab滤波器及均衡器设计
  12. 最小生成树的实现(C语言)
  13. 电子面单打印通用解决方案(PHP代码示例)
  14. Vivado 2020 安装
  15. 玩游戏蓝牙耳机哪款好?适合打游戏的无线蓝牙耳机推荐
  16. 互联网晚报 | 7月17日 星期日 | iPhone 14量产在即;首款国产科学计算软件研发成功;上半年广东人均收入2.47万元...
  17. 2021乌兰浩特四中高考成绩查询,2021内蒙古地区高考查分详细
  18. 第14周—项目1(3)二叉排序树
  19. [转]手机号码归属地接口
  20. NFT交易市场的下一站是社区主导

热门文章

  1. 安规认证的测试项目(工程师必须知道的知识)
  2. 灵感专题—2019年优秀网页设计作品赏析#5月
  3. 《网络科学导论》——博弈模型笔记
  4. Java开发的学生考勤系统多人脸识别签到二维码签到
  5. 有什么推荐的计算机毕设题目吗?2023最新springboot计算机毕业设计选题大全
  6. js模拟下雨js特效代码
  7. [4G5G专题-22]:架构-3GPP组织以及3GPP标准各个版本的演进路线
  8. 学习笔记--STM32F205+LCD
  9. clion生成qt的qrc文件
  10. word中的特殊文本符号