教你一步一步用OpenGL写游戏——前言

关于这套教程

这是一个系列的教程。在这套教程里,我将会把之前用OpenGL+Qt做过的一款游戏和大家分享,并且从头到尾一步步分析整个游戏的实现过程和架构设计。
关于写这些东西的目的,我想大概有三点吧:其一是想把自己写过的这个游戏重新梳理一遍,认真重构重构,真正理解其中用到的技术和算法,更加深入地把握软件项目开发技巧以及各种设计模式的运用;其二是想借CSDN这个平台和广大网友讨论和学习,毕竟是闭门造车做出来的东西,不拿出来给外人看是不知道好坏的;其三算是我的一点感恩之心吧。以前自己一直做伸手党,只知道看别人的文章,却从来不自己动手写点有价值的干货。这次打算趁暑假的空闲时间,以我写的那个游戏为例写几篇教程,希望能帮助大家更好的理解OpenGL和Qt,以及游戏程序设计方面的一些知识。

关于Paradise

Paradise就是我上面提到的那款游戏。这是一款3D建筑游戏,玩家可以用各种方块创建属于自己的世界。想必大家此刻都想到了一款大名鼎鼎的游戏:MineCraft。是的,Paradise可以说就是MineCraft的建筑模式,我也是在玩过MineCraft之后才有了灵感的。去年暑假的时候开始写这个游戏,大概花了一个多月的时间终于完成。今年5月份的时候又在之前代码的基础上改了许多,最终完成了当前这个游戏版本。下面是游戏截图:


这里写图片描述
图1 菜单界面


这里写图片描述
图2 设置界面


这里写图片描述
图3 帮助界面


这里写图片描述
图4 世界选择界面


这里写图片描述
图5 游戏内界面


这里写图片描述
图6 游戏截图一


这里写图片描述
图7 游戏截图二

玩法
1.使用“WASD”键移动视角,移动的同时按住“shift”键可以加速;
2.移动鼠标旋转视角;
3.按鼠标左键创建物块,按鼠标右键破坏物块;
4.使用滚轮或者按下数字键1-9选择当前物块类型;
5.按F键将摄像机移动到当前物块附近;
6.按E键打开物块库界面;
7.按B键打开批量创建界面;
8.按O键打开场景编辑器界面;
9.按空格键播放下一首背景音乐。

技术梳理

  • 基础框架
    原生OpenGL + Qt

  • 第三方库
    Assimp
    FreeImage
    glm

  • 技术特色
    支持Geometry Instancing
    支持Frustum Culling
    支持三种灯光系统(方向光源、点光源、聚光灯光源)
    支持Shadowmapping
    支持鼠标拾取
    支持MSAA抗锯齿

其实从本质上来说,Paradise更像是一个简单的游戏引擎,或者说一个3D地形编辑器。用户可以用最简单的立方体块,一点一点创建一个复杂丰富的虚拟世界。虽然Paradise的可玩性可能并不高,但在写这个程序的过程中我却学习到了很多东西,有很多收获。在这一点上,Paradise对我来说是意义非凡的。

如果你想学习OpenGL,或者想用OpenGL写点有意思的东西,那就跟我来吧!

游戏下载地址:
欢迎大家下载试玩^_^

OpenGL是一个强大的图形库,用于渲染3D图形,但不直接支持微分几何(如微分画圆或圆柱)的概念,因为这些是数学概念,而不是图形API的直接功能。在OpenGL中,我们通常绘制几何模型,如圆和圆柱,是通过指定顶点坐标、纹理坐标和索引等信息来实现的。 绘制圆的基本步骤是创建一个圆形路径的数据结构(比如一个包含x,y坐标的顶点数组),然后调用`glBegin(GL_LINE_LOOP)`开始一个线段连接的循环,传递顶点数据,`glEnd()`结束这个循环。对于圆柱,你需要定义两个圆(底面和侧面),并可能还需要计算和设置正确的视角和投影变换。 这里是一个简单的示例代码片段,用于使用OpenGL ES 2.0(移动平台常用版本)在屏幕上画一个基本的圆: ```c++ // 假设我们已经设置了OpenGL上下文和基本设置 GLuint vertexShaderID; GLuint fragmentShaderID; GLuint programID; // 定义顶点数据(假设半径为1) float vertices[] = { -1.0f, 1.0f, 0.0f, // 底部左 1.0f, 1.0f, 0.0f, // 底部右 -1.0f, -1.0f, 0.0f, // 顶部左 1.0f, -1.0f, 0.0f // 顶部右 }; // 初始化并编译顶点着色器和片段着色器 // ... glUseProgram(programID); glVertexAttribPointer(vertexAttribute, 3, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(vertexAttribute); // 绘制圆 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 使用三角形扇形绘制圆 // 清除颜色缓冲 glClear(GL_COLOR_BUFFER_BIT); ``` 至于微分画圆或圆柱,这通常涉及到更高级的数学和图形算法,比如贝塞尔曲线或参数化曲面,这些在OpenGL中通常是通过计算出一系列近似的线段来实现的,而不是通过直接绘制数学上的精确圆。 如果你对微分几何或如何将它们应用到OpenGL图形编程感兴趣,你可能会想学习计算机图形学的相关理论,并研究曲线和曲面的生成算法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值