opengl编程指南

时间:2025-04-03 09:34:16编辑:分享君

OpenGL简介

上一节已经搭建好了开发环境,在正式学习如何用OpenGL前,我们先了解一下OpenGL的基础知识。

一、OpenGL是什么

一般它被认为是一个API,包含了一系列的函数,用来操作各种图形图像。事实上并不是,OpenGL仅仅是一个由一个名为Khronos组织制定并维护的规范。但是,我宁愿把它当成是API来理解,因为规范严格规定了OpenGL各函数的输入和输出,内部细节都是开发者自行决定。那么以API来理解,我认为是很合理的。(其实OpenGL函数大多是各显卡厂商开发的,所以如果你在用OpenGL开发过程中如果遇到问题,可以尝试更新显卡驱动的方式来解决,当然,前提是你还要确定一下显卡厂商)

如果你想了解OpenGL规范细节,可以访问https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf。

二、状态机

OpenGL是一个状态机,无论是官方信息还是网络上的信息,都解释的比较繁琐和复杂。

我认为,可以这么理解,当我们用OpenGL去绘制一个三角形时,要把OpenGL当前状态设置成可以绘制三角形的状态,比如颜色、线条啥的,渲染就出来三角形了。如果又想绘制线段了,就把OpenGL当前状态再设置成线段的状态,就可以渲染出线段了。

说白了,就是想绘制啥,就把状态设置先设置成啥,这就是状态机。(这是我自己理解的,哈哈)

三、核心模式与立即渲染模式

OpenGL3.2之前,它都是立即渲染模式,3.2之后,它使用了核心模式,抛弃了立即渲染模式。

那么什么是立即渲染模式,什么是核心模式呢?

我查了网上很多资料,都没有把这个事情说清楚,我通过各种文章,是这么理解的:

立即渲染模式是类似这样:

glBegin( GL_TRIANGLES );

    glVertex3f(-1.0f, -0.5f, -4.0f);

    glVertex3f( 1.0f, -0.5f, -4.0f);

    glVertex3f( 0.0f, 0.5f, -4.0f);

glEnd();

上面是绘制三角形的,具体可以不用追究。只要明白,设置好点,放在glBegin和glEnd之间,就能渲染出来三角形了。这就是立即渲染模式。

而核心模式就要关注细节了,它是如何用点和颜色渲染图形的,都需要开发者参与设计。

暂时我就理解到这个程度,后续边学边理解吧。

四、对象

OpenGL库是用C语言写的,我们知道C语言是面向过程的,之前的OpenGL也是面向过程的,比如,绘制一个图形,就要设置好顶点和颜色,如果再绘制一个,就要再设置一次。而OpenGL引入“对象(Object)”后,就方便多了。比如:

// 创建对象

unsigned int objectId = 0;

glGenObject(1, &objectId);

// 绑定对象至上下文

glBindObject(GL_WINDOW_TARGET, objectId);

// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项

glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);

glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);

// 将上下文对象设回默认

glBindObject(GL_WINDOW_TARGET, 0);




上面这段是在网上抄过来的,不过,说明很详细,我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文(就是设置内容,比如颜色、大小等等)的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

说白了,就是,创建一个对象,先用一个ID保存起来,并设置好内容,想用了,将这个ID跟设置目标(比如GL_WINDOW_TARGET)绑定,就可以用了,不用每次都重新设置。

好了,这次了解了一些OpenGL的基础,下一次就可以开心正式学习OpenGL了。


OpenGL游戏编程的目录

序前言作者简介第1章 游戏开发快速入门1.1 游戏软件开发概述1.1.1 游戏软件开发流程1.1.2 游戏软件的构成1.1.3 游戏软件的运行原理1.2 OpenGL与DirectX简介1.2.1 OpenGL基础知识1.2.2 DirectX基础知识1.3 3D图形学快速入门1.3.1 点和向量1.3.2 坐标系与矩阵1.3.3 3D图形处理流程1.3.4 坐标变换第2章 OpenGL.程序框架2.1 窗口渲染环境2.1.1 GDI设备环境2.1.2 OpenGL渲染环境2.2 创建Win32SDK风格的窗口2.3 面向对象风格的窗口框架2.3.1 窗口类GLWindow的设计及实现2.3.2 键盘类Keys的设计与实现2.3.3 应用程序类GIApplication的设计与实现2.3.4 一个简单的实例第3章 OpenGL变换  3.1 OpenGL的数据类型  3.2 函数命名的语法  3.3 OpenGL是种状态机  3.4 OpenGL变换  3.4.1 视点变换  3.4.2 模型变换  3.4.3 投影变换  3.4.4 视口变换  3.4.5 裁剪变换  3.4.6 矩阵堆栈  3.5 OpenGL变换实例  第4章 OpenGL光照、材质和纹理  4.1 真实感图形基本概念  4.2 OpenGL光照模型  4.2.1 法线向量  4.2.2 创建光源  4.2.3 选择光照模型  4.2.4 光照实例  4.3 材质  4.3.1 材质RGB值与光源RGB值的关系  4.3.2 材质的定义  4.3.3 颜色材质模式  4.3.4 材质实例  4.4 纹理映射  4.4.1 纹理资源的载入  4.4.2 OpenGL纹理映射  4.4.3 OpenGL多重纹理  第5章 OpenGL字体  5.1 位图字体  5.1.1 位图字体类  5.1.2 具体实现  5.1.3 实例  5.2 显示中文  5.2.1 字体类  5.2.2 具体实现  5.2.3 实例  第6章 摄像漫游  6.1 漫游原理  6.2 准备工作  6.3 摄像机类  6.4 摄像漫游实例  第7章 构造天空和地形  7.1 天空构造  7.1.1 天空盒原理  7.1.2 天空类实现  7.2 地形  7.2.1 地形构造原理  7.2.2 地形类实现  7.3 实例  第8章 模型载入  8.1 3DS文件载入  8.1.1 3DS文件简介  8.1.2 准备工作  8.1.3 载入类定义  8.1.4 3DS文件载入实例  8.2 MD2文件载入  8.2.1 MD2文件简介  8.2.2 准备工作  8.2.3 MD2文件载入类  8.2.4 MD2文件载入实例  第9章 实时阴影  9.1 简介  9.2 实时阴影  9.2.1 平面投射  9.2.2 阴影体  9.3 平面投射实例  9.4 阴影体实例  第10章 Directlnput的使用  10.1 Directlnput简介  10.2 Directlnput的使用  10.2.1 安装和配置DirectX9.0  10.2.2 创建Directlnput接口对象  10.2.3 创建设备对象  10.2.4 设置设备的数据格式  10.2.5 设置设备的协作层次  10.2.6 设置设备的属性  10.2.7 设备的捕获  10.2.8 设备输入的获取  10.2.9 关闭  10.3 建立输入系统  10.3.1 键盘类CKeyboard  10.3.2 鼠标类CMouse  10.3.3 游戏杆类CJoystick  10.3.4 输入系统类CInputSystem  10.4 DirectSound应用实例  10.4.1 键盘实例  10.4.2 鼠标实例  第11章 DirectSound的使用  11.1 声音的基础知识  11.2 DirectSound介绍  11.3 DirectSound的使用  11.3.1 创建DirectSound对象  11.3.2 设置设备的协作级别  11.3.3 创建主缓冲区  11.3.4 创建辅助缓冲区  11.3.5 加载声音数据  11.3.6 声音的播放与控制  11.4 3D音效  11.4.1 3D空间与缓冲区  11.4.2 最大最小距离  11.4.3 处理模式  11.4.4 声音圆锥  11.4.5 声源的创建  11.4.6 听者对象的创建  11.5 封装音频处理模块  11.6 音频实例  第12章 游戏中的物理模拟  12.1 物理学基础知识  12.1.1 基本概念  12.1.2 牛顿运动定律  12.1.3 冲量、动量  12.2 物理规律的模拟  12.2.1 匀速运动模拟  12.2.2 平抛运动模拟  12.2.3 摩擦力模拟  12.3 碰撞检测  12.3.1 碰撞检测概述  12.3.2 碰撞检测  12.3.3 碰撞检测实例  第13章 粒子系统  13.1 粒子系统简介  13.1.1 概述  13.1.2 分类  13.1.3 粒子系统的生命周期  13.2 粒子系统设计  13.2.1 形式描述  13.2.2 数据结构  13.3 粒子系统的实现  13.4 粒子系统实例l——雪花  13.5 粒子系统实例2——喷泉  第14章 构造游戏引擎  14.1 游戏引擎简介  14.2 游戏引擎的体系结构  14.3 基础公用模块  14.3.1 基础结构和操作  14.3.2 数学运算模块  14.3.3 计时器CT'imer类  14.3.4 字体类  14.3.5 摄像机类  14.3.6 INI文件读取类  14.4 窗口引擎模块  14.5 输入系统模块  14.5.1 输入法IME编程  14.5.2 输入系统类  14.6 场景管理模块  14.6.1 对象管理模块  14.6.2 游戏场景模块  14.6.3 场景管理模块  14.7 资源管理模块  14.8 GuI界面设计模块  14.8.1 GUI模块构架  14.8.2 按钮类CButton  14.8.3 复选框类CCheckBox  14.8.4 文本编辑类Edit  14.8.5 对话框类Dialog  14.8.6 滚动条类CScrollBar’  14.8.7 列表框类L,istView  14.8.8 进度条类CProgressBar  14.8.9 小地图类MapView  14.9 消息系统模块  14.10 音频系统模块  14.11 粒子特效模块  第15章 3DRPG游戏  15.1 游戏简介  15.2 角色设计  15.3 加入怪物  15.4 游戏场景  15.5 光标动画  15.6 游戏界面  15.7 运行界面  第16章 Quake室内场景实例  16.1 BSP技术  16.1.1 为什么要使用:BSP  16.1.2 BSP原理  16.1.3 渲染BSP  16.2 隐藏面剔除  16.3 Quake室内场景绘制  16.3.1 Quake3BSP文件格式  16.3.2 Quake3BSP文件的载入  16.3.3 运行结果  第17章 指环王动画特效  17.1 实例介绍  17.2 关键技术  17.2.1 ASE模型读取  17.2.2 火焰的绘制  17.2.3 场景的绘制

OpenGL入门 - 1

简单来说就是实现图形的底层渲染 A. 比如在游戏开发中,对于游戏场景/游戏人物的渲染 B. 比如在音视频开发中,对于视频解码后的数据渲染 C. 比如在地图引擎,对于地图上的数据渲染 D. 比如在动画中,实现动画的绘制 E. 比如在视频处理中,对于视频加上滤镜效果 OpenGL/OpenGL ES/Metal 在任何项目中解决问题的本质就是利用 GPU 芯片来高效渲染图形图像。 图形 API 是 ios 开发者唯一接近 GPU 的方式。 OpenGL 阶段: OpenGL ES 阶段: Metal 阶段: 固定管线/存储着⾊器 顶点数据是由CPU/GPU来处理? 顶点缓存区:区域(不在内存!->显卡显存中。) 片元着色器 像素着色器 片元函数 GPUImage [-1,1]标准化设备坐标系(NDC) 物体/世界/照相机空间->右手系 规范化设备坐标:左手系。 x,y,z => 0,1,2 注意OpenGL中坐标系 OpenGL中的物体,世界,照相机坐标系都属于右手坐标系,而规范化设备坐标系(NDC)属于左手坐标系。笼统的说OpenGL使用右手坐标系是不合适的 OpenGL希望每次顶点着色后,我们的可见顶点都为标准化设备坐标系 (Normalized Device Coordinate, NDC)。也就是说每个顶点的x,y,z都应该在-1到1之间,超出这个范围的顶点将是不可见的。 通常情况下我们会自己设定一个坐标系范围,之后再在顶点着色器中将这些坐标系变换为标准化设备坐标,然后这些标准化设备坐标传入光栅器(Rasterizer),将他们变换为屏幕上的二维坐标和像素。 将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分布进行的,也是类似于流水线那样。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系系统(Coordinate System)。将物体的坐标变到几个过渡坐标系(Intermediate Coordinate System)的优点在于 在这些特定的坐标系统中,一些操作或运算更加方便和容易,这一点很快就变得明显。对我们来说比较重要的总共有5个不同的坐标系统。 这是一个顶点在最终被转化为片段之前需要经历的所有不同的状态。为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是 模型(Model)、观察(View)、投影(Projection)三个矩阵。 物体顶点的起始坐标在局部空间(Local Space),这里称为局部坐标(Local Coordinate),他在之后在变成世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后转为屏幕坐标(Screen Coordinate) 的形式结束。 物体坐标系: 每个物体都有他独立的坐标系,当物理移动或者改变方向时。该物体相关联的坐标系将随之移动或改变方向。 物体坐标系是以物体本身而言,比如,我先向你发指令,”向前走一步“,是向你的物体坐标系发指令。我并不知道你会往哪个绝对的方向移动。比如说,当你开车的时候,有人会说向左转,有人会说向东。但是,向左转是物体坐标系的概念,而向东则是世界坐标系概念。 在某种情况下,我们可以理解物体坐标系为模型坐标系。因为模型顶点的坐标都是在模型坐标系中描述的。 照相机坐标系: 照相机坐标系是和观察者密切相关的坐标系。照相机坐标系和屏幕坐标系相似,差别在于照相机坐标系处于3D空间中,而屏幕坐标系在2D平面里。 为什么要引入惯性坐标系? 因为物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移。 OpenGL最终的渲染设备是2D的,我们需要将3D表示的场景转换为最终的2D形式,前面使用模型变换和视觉变换将物体坐标转到照相机坐标系后,需要进行投影变换,将坐标从照相机坐标系转换为裁剪坐标系,经过透视除法后,变换到规范化设备坐标系(NDC),最后进行视口变换后,3D坐标才变换到屏幕上的2D坐标,这个过程入下图: 在上面的图中, 注意,OpenGL只定义了裁剪坐标系、规范化设备坐标系、屏幕坐标系,而局部坐标系、世界坐标系、照相机坐标系都是为了方便用户设计而自定义的坐标系,他们的关系如下图: OpenGL 然后对裁剪坐标执行透视除法从而将他们变换到标准化设备坐标。 OpenGL 会使用glViewPort内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标关联一个屏幕上的点。这个过程称为视口变换 局部坐标系(模型坐标系)是为了方便构造模型而设立的坐标系,建立模型时我们无需关心最终对象显示在屏幕那个位置。 模型变换的主要目的是通过变换使得用顶点属性定义或者3d建模软件构造的模型,能够按照需要,通过缩小、平移等操作放置到场景中合适的位置, 通过模型变换后,物体放置在一个全局的世界坐标系中,世界坐标系是所有物体交互的一个公共坐标系 视变换是为了方便观察场景中物体而建立的坐标系,在这个坐标系中相机是个假设的概念,是为了便于计算而引入的。相机坐标系中的坐标,就是从相机的角度来解释世界坐标系中的位置 OpenGL中相机始终位于原点,指向 -Z轴,而以相反的方式来调整场景中物体,从而达到相同的观察效果。例如要观察-Z轴方向的一个立方体的右侧面,可以有两种方式: GLShaderManager的初始化 GLShaderManager shaderManager; shaderManager.InitializeStockShaders();

上一篇:qq酷网名

下一篇:没有了