- 博客(189)
- 资源 (9)
- 收藏
- 关注
原创 OpenGL游戏引擎开发[10]-多重纹理
简介 有时候我们在游戏,会看到类似这样裸露的土地、沼泽之类的:这是游戏《自然之力》的地图,在草地上会有“粘土”、“黑土”这样裸露的区域,玩家能够在这片区域挖土,不同的材料可以制作不同的道具。那这个是怎么做的呢?最粗暴的办法,就是画一个这样的纹理,贴到地形上还有一种就是使用几种不同的纹理对地形进行混合贴图比如,unity中刷地形的时候,就是使用第二种办法,事先加载好纹理,再使用“刷子”在地形上画对应的纹理贴图。这节我们使用代码来实现这样的效果。原理 原理很简单,就是取不同的纹理贴图的
2020-12-27 20:04:08
569
原创 OpenGL游戏引擎开发[9]-雾特效
今天来在场景中添加雾的特效。原理雾的计算公式为:1visibility = e^((distance * density)^gradient)23// 其中 distance 为物体顶点距离相机的位置4// density 可以理解为雾的密度5// gradient 为雾的衰减系数,用来表示相机拉近时,雾褪去的快慢程度因为雾远处看和天空的颜色是混为一体的,因此,一般在场景中使用天空的颜色作为
2020-12-11 13:50:57
560
原创 OpenGL游戏引擎开发[8]-巧用贴图透明度通道显示复杂模型
使用透明度渲染物体我们游戏中的模型一般都是在3D建模中做的,比如:人物模型、建筑模型等。这些模型直接关系到游戏的效果,所以,美工人员花费很大精力去雕琢模型也无可厚非。然而,那些环境的装饰的模型,比如:草、杂草、、、 这些模型本来形状就不规则,3D建模比较麻烦,而且只是装饰作用,玩家也不一定把它当回事,所以,没必要画很大精力去雕琢这些模型。但是,你也不能太磕碜吧,你随意搞个太丑的模型,和场景中其他模型放在一起毫无违和感,那这。。。其实,我们可以有个取巧的办法。既能基本满足可视化的需求,对模型的要求也不
2020-12-09 23:30:28
560
1
原创 OpenGL游戏引擎开发[7]-生成南京地形图
获取南京地形高度图数据上节我们自己生成另一个平面地形,这节我们生成一个带有真实地形高度的【南京玄武区】的地形图。如果大家玩过《城市天际线》的画,都知道游戏里面可以导入现实世界真实的地图的。其官网提供了一个工具:http://terrain.party/这是一个使用openlayers地图库制作的一个在线生成真实世界地形高度图的工具,我们在上面找到想要生成高度图的区域,就可以使用右侧的工具栏下载按钮进行下载。下载下来一个压缩包:里面有文件的说明信息,请自行查看。这里我们使用融合过的高度图【na
2020-12-06 19:22:20
567
原创 OpenGL游戏引擎开发[6]-生成简单地形
好久没更新了,没办法,要写毕业论文。。。今天来讲一下如何生成简单地形。一般小游戏中的地形是由程序生成的,比如《我的世界》的地形,每次新建一个存档,都会生成一个新的地图。常见的方法就是使用柏林噪声随机函数生成地形高度图,如:这个这是在线使用柏林噪声随机函数生成地形高度图的工具,可以在这上面生成高度图,然后把高度图下载下来,再读取高度图生成地形。本节,我们先写个简单的,先不使用高度图,先自己生成个平面网格,就像这样:其实思路和前面加载STL模型是一样的,只不过,STL模型是从文件读取数据的,
2020-12-06 00:37:10
1394
原创 Js函数对象与普通对象的区别
function Test(word) { console.log(word); } // 里面的this是顶级对象window,返回值是undefined。 // Test('哈哈,我是函数'); // 它会先new一个对象,置类型为Test,之后把它作为this执行Test函数,最后再把对象返回。 // new Test('哈哈,我是对象'); // 将以上的调用方式换种通俗易懂的方式 // Test.call("哈哈,我是...
2020-11-18 16:27:25
1269
原创 OpenGL游戏引擎开发[5]-自己动手写STL模型加载器
前面我们绘制的物体要么是手动设置的顶点(比如简单的三角形),要么是程序生成的顶点(比如绘制的地球)。还有一种就是加载3D建模软件建好的3D模型。常见的3D模型格式有很多:.OBJ, .STL, .PLY, .fbx, .x 等等。当然加载这些3D模型有成熟的第三方库,如Assimp,我们自己手动写代码解析这些模型的格式是为了熟悉模型加载的流程,为了以后在使用第三方库的时出错了,或者加载的模型和预期的结果不同时,方便排错。本节我们来介绍如何加载STL格式的3D模型。这种格式很简单,只包含顶点数据位置数据以及
2020-05-16 13:46:26
516
原创 OpenGL游戏引擎开发[4]-在OpenGL绘制纹理
上一节我们学会了使用OpenGL着色器,但是在片段着色器中,我们使用简单纯色来绘制物体,这一节,我们要在片段着色器中使用采用器对纹理进行采样输出,作为物体表面的颜色,进而绘制带有纹理贴图的物体。纹理纹理简单来说就是一张图片,最常见的就是王者荣耀中英雄的皮肤,当然,这里只说游戏角色的外观,因为不同的皮肤还有不同的特效,甚至有不同的人物动作。不同的游戏人物外观就是换了不同纹理贴图。根据纹理的作用,纹理贴图可以分为:普通纹理(就是着色用的)、法线贴图、切线切图… 顾名思义,普通纹理中存储的就是颜色值,就是我
2020-05-14 01:48:46
654
原创 OpenGL游戏引擎开发[3]-OpenGL的着色器GLSL
本节将学习OpenGL的着色器语言GLSL。本节效果主要内容什么是着色器如何在OpenGL中使用Shader如何编写顶点着色器和片段着色器代码实现过程什么是着色器前面说了,3D编程要完成2件事。物体显示在哪?物体显示成什么样?着色器,也叫shader,字面意思就是用来着色的。当然,它也顺便完成了物体的空间变换。换句话说,3D渲染流水线就是在着色器中实现的,当然它要配合OpenGL的相关渲染指令来完成更加高级的操作,比如:帧缓冲区采样、像素缓冲区的应用等。它是一小段类似于C语
2020-05-10 11:13:57
1301
原创 OpenGL游戏引擎开发[2]-使用VAO和VBO绘制图形
基本概念本节介绍如何使用VAO和VBO进行图形绘制。关于VAO和VBO的概念,大家可以查阅 LearnOpenGL 等相关教程,我如果介绍的话,篇幅就太长了。而这些常见的OpenGL概念网上资料很多,这里我只简单介绍下我对相关概念的理解,如果各位不了解话,请查阅相关的OpenGL书籍。CPU 与 GPU大家都知道,我们平时写的程序是运行在CPU上的,CPU适合做逻辑运算。图形程序需要大量的...
2020-05-06 01:39:43
790
原创 OpenGL游戏引擎开发[1]-环境搭建
前言我的计划是带大家从零开始写一个简单的渲染引擎出来。当然,我不可能每行代码都放在文章中,每节内容我们围绕一个主题,我先讲解原理,再讲解OpenGL实现的关键代码,然而我会把代码给大家,大家自行查阅。一些基本的OpenGL知识,大家可以看 LearnOpenGL 的教程,这个教程是以知识点的形式给大家讲的,我们在这里是将这些知识点串起来实现一些效果,让大家明白这些知识点在实战中是如何运用的。我...
2020-04-30 21:43:42
1328
原创 从零开始实现3D软光栅渲染器 (5-1) 3D渲染流水线(上)
什么是渲染流水线把大象放冰箱,需要几步?打开冰箱放入大象关上冰箱再放一个呢?打开冰箱放入大象关上冰箱这就是流水线。渲染流水线(装逼的就叫渲染管线),其实解决了2个问题:把3D物体显示到2D屏幕,3D空间的物体显示在屏幕上什么地方?物体该显示成什么样子?玻璃应该显示成透明的吧?放在玻璃后面的物体应该能看到吧?水泥地面,草地,墙面看起来应该不一样吧?总之,你显示的东...
2020-04-26 14:59:51
887
原创 从零开始实现3D软光栅渲染器 (4) 三维空间变换
世界是3D的,显示器是2D,将三维空间的物体变换到二维空间,再到最终屏幕上成像的过程,在图形学中叫做3D渲染流水线。这个过程着实有点复杂了,让我们慢慢来,本节我们先介绍一些基本的空间变换知识。这部分知识点非常重要,不管以后做游戏、仿真项目,还是其他图形应用,物体的空间变换是必须要理解的,因为很多实际的需求需要你自己分析,再去实现。就Unity来说吧,它已经把图形学中的矩阵、向量运算封装的相当易用...
2020-04-17 23:35:39
472
7
原创 从零开始实现3D软光栅渲染器 (3) 绘制直线
简介上一节中我们在canvas中绘制了点,这一节我们来绘制直线。计算机图形学中,绘制直线的算法很多,比如:DDA算法,中点画线算法…今天我们来讲一个经典的算法:Bresenham算法。经典之所以是经典,因为它既保证了绘制直线的效率,而且也能绘制圆弧、抛物线等。大家都知道,显示器屏幕像素是由像素组成的,我们看到画面的过程,其实就是每个像素填充不同的颜色罢了。简单说,不就是一个二维数组嘛,只不...
2020-04-05 21:19:12
440
原创 01 VS2015编译OSG
下载资源官网最新osg源码我们使用的是 OpenSceneGraph-3.6.5VS2015依赖我们下载 Visual Studio 2015 32-bit v140-x86.zip组织目录结构配置dx的环境变量,这里我们安装了dx sdk 2010cmake生成VS2015解决方案cmake的使用方法可以参考这里生成VS解决方案后,用VS2015打开,编...
2020-03-24 23:41:16
284
原创 VS2015 编译 mongodb c driver
准备cmakeVS2105下载源码[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yGOMXyKd-1585052064416)()]源码中要求cmake的版本是3.1+[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEfy9oTV-1585052153268)(])...
2020-03-24 20:46:11
457
原创 从零开始实现3D软光栅渲染器 (2) 绘制点
canvas简介 是HTML5新增的2D绘图标签,并为用户提供了一系列绘图命令,类似于windows中的GDI接口。我们的软渲染器就是要把图形绘制到canvas上,大家可以通过这个来了解下canvas的基本用法。在本教程中,我们仅使用canvas很少的几个接口,用到的时候我们再介绍。框架搭建我们首先在VS Code中建立如下目录结构:Device.js 用来封装在canvas的一些操作...
2020-03-21 14:30:27
475
原创 从零开始实现3D软光栅渲染器 (1) 简介
如何在2D屏幕上表示3D物体?这是学习3D编程必须要搞明白的事情。大家都知道,调用OpenGL的函数,给定三角形的3个顶点位置,颜色,就能在屏幕上画一个三角形,再加载一幅图片,就可以给这个三角形附上纹理,还能让这个三角形绕某个坐标轴发生旋转… 这些看似简单的问题的背后,实则是3D编程的内功。大家都知道,学武之人,拼的是内力,花里胡哨的招式的确很博人眼球,但是从长远来看,收益远没有修炼内力高。而一...
2020-03-20 23:52:36
2040
原创 OpenGL帧缓冲
帧缓冲的概念帧缓冲其实就是存储了我们绘制到屏幕上的像素值。每次渲染前,使用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);就是清空帧缓冲中的内容,以达到每帧绘制一幅图像的目的。一般我们在使用GLFW这样的库进行OpenGL绘制的时候会绘制在默认的GLFW为我们分配好的帧缓存中,暂时称之为"默认缓冲"。我们也可以自己新建一个帧缓存,来...
2019-03-19 22:43:09
535
原创 从零开始Java游戏引擎[LWJGL](4)-使用索引缓存
如果只是有顶点缓冲的话(即使有glDrawArray进行绘制),会存储顶点冗余。例如:显示一个矩形,要画2个三角形,每个三角形3个顶点,就要准备6个顶点传递到glDrawArray函数中。其实,画一个矩形只需要4个顶点就可以了,不是吗?你可能认为,这有什么的?不就是多传递了2个顶点吗?其实不然,你现在只是画2个三角形,当你画一个吃鸡的场景时,里面的人物,地形,建筑,枪械等等,所有的物体都需要使...
2018-08-02 09:36:04
1204
1
原创 从零开始Java游戏引擎[LWJGL](3)-使用VAO和VBO绘制图形
本节介绍如何使用VAO和VBO进行图形绘制。先看效果:本系列文章关注的重点是游戏引擎的开发,关于OpenGL的基础知识,这里就不再详细讲了,否则篇幅篇幅就太长了。这里的相关概念我只简单讲下我自己的理解,如果各位不了解话,请查阅相关的OpenGL书籍。VBO:顶点缓存对象,其中存储着顶点的相关信息(包括:顶点坐标、顶点颜色、顶点法线、纹理坐标等,这些也就是常说的顶点属性)。每个VBO...
2018-07-27 11:10:52
2862
1
原创 从零开始Java游戏引擎[LWJGL](2)-第一个窗口
接下来开始创建第一个窗口。先看效果: 其实也没啥好看的,就是一个黑乎乎的窗口。主要函数包括三个:createDispaly(); updateDisplay(); closeDisplay();很简单是不是,其中LWJGL库帮我们封装了大部分的窗口创建功能,我们只需要调用相应的窗口创建函数即可。新建DisplayManager类:package renderE...
2018-07-27 10:44:47
3072
原创 从零开始Java游戏引擎[LWJGL](1)-环境配置
序言浑浑噩噩,断断续续学习OpenGL已经很长时间了,一直没能持之以恒学习下去,杂事太多,学习没有连续性,又没有合适的项目进行练习,导致前面学习的内容很快遗忘。刚好赶在暑期封闭期间,再重新拾掇前面学习的知识,并做些笔记以免遗忘。说明:本教材翻译自ThinMatrix学习必须:1.要求初学者具备一定的Java编程知识2.要求初学者具备一定的OpenGL编程知识每篇博客先讲解必...
2018-07-27 10:36:26
7068
转载 .NET 托管代码和非托管代码的区别
转自:http://gaoling386.blog.163.com/blog/static/54046024201222045754681/什么是托管代码(managed code)?托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段...
2018-03-28 11:47:08
2717
原创 WKT转GeoJson(js版)
先来个Polygon(包括MultiPolygon)转GeoJson的,最近有点忙,等有空加上其他的:function processPolygonString2PolygonArray(polygonString, proj) { var geoJson = {}; if (polygonString.startsWith("MULTIPOLYGON")) {
2017-08-14 23:39:57
7255
2
原创 《自制编译器》在Ubuntu16.04中运行CBC
<1>配置java环境 参见我的上一篇博客: http://blog.csdn.net/birdflyto206/article/details/76942230<2>下载64位的cbc https://github.com/leungwensen/cbc-ubuntu-64bit<3>安装cbc 解压,到解压目录中执行命令:sudo ./install.sh<4>使Ubuntu64支持32
2017-08-08 23:55:22
925
原创 js异步变同步小技巧-递归
在写js的时候,很多时候都会遇到异步转同步的问题。比如:从服务器端返回一个集合数据,在遍历集合的时候,又要异步去请求别的数据,但是for循环必须在同步的情况下执行。这时候,怎么办?解决这种问题的办法可能会有很多。但是,现在介绍一个最简单,也最容易理解的方法,那就是递归。例如:从服务端返回一个数组:paramsfor(var i =0 ; i < params.length; i++){ //
2017-05-22 17:00:02
19174
3
原创 设计模式(18)之职责链模式
给大家出一个题:编写一个程序,把大象放进冰箱,要体现出操作的步骤顺序。看我给大家显摆一个:1.创建一个Handle对象//SaveElephantHandle.javapackage 职责链模式;public abstract class SaveElephantHandle { public abstract void SaveElephant();}2.创建各步骤对象//OpenFr
2017-03-31 20:40:32
396
原创 AGG入门(1):VS2013编译agg源码
1.源码下载:http://www.antigrain.com/download/index.html 这里我们下载最新版本agg2.52.打开VS2013,新建一个空项目,将下载的agg源码包解压,拷贝以下cpp到VS2013的工程中:./src/ 目录下所有cpp文件【核心库】* ./src/ctrl/ 目录下所有cpp文件【控件库】* ./src/platform/ 下对应平台目录(win
2017-03-30 14:00:51
1979
原创 关于渲染帧率(FPS)的问题
先列举几个关于渲染帧率的文章: 1. http://ruinerlee.blog.163.com/blog/static/215611167201292990203/ 2. http://blog.codingnow.com/2008/04/fps.html 3. http://blog.csdn.net/strongcoding/article/details/6252313#include
2017-03-02 00:34:23
11056
原创 设计模式(17)之中介者模式
OK,我们先来看一个找对象的例子:简单说下,Person类的每个实例之间,要发生关系(好猥琐~~~)… 其中,Person类中的抽象方法getPartner()在Man和Woman子类中都有自己的实现,当Man找到Woman且他们的property值相等时,才算配对成功,反之……..首先,有一个Person抽象类://Person.javapackage com.wj.ex1;public abs
2016-12-26 22:40:44
346
原创 设计模式(16)之解释器模式
一、什么是解释器模式Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。二、解释器模式应用场景当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好: 该
2016-12-26 17:20:09
312
原创 设计模式(15)之适配器模式
一、什么是适配器模式Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类或外部类)的接口形式。二、适配器模式应用场景在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。但这样一来,会带来一个
2016-12-14 17:34:55
301
原创 Cocos2d-x运行机制-代理模式
Cocos2d-x的入口:CCApplicationProtocol接口:定义通用接口// CCApplicationProtocol.h#pragma onceclass CCApplicationProtocol{public: CCApplicationProtocol(); virtual ~CCApplicationProtocol(); virtual boo
2016-11-19 12:58:12
853
原创 地理空间数学基础
地球表面几何模型: 1、第一类 地球的自然表面,起伏不平、不规则,难以用一个简洁的数学模型表达。2、第二类 相对抽象的面–大地水准面。假设当海水处于完全静止的平衡状态时,从海平面延伸到所有大陆下部,而与地球中立方向处处正交的一个连续、闭合的水准面,这就是大地水准面。水准面是一个重力等位面。对于地球连续空间而言,存在无数个水准面,大地水准面是其中一个特殊的重力等位面,它在理论上与
2016-10-26 22:23:59
1490
翻译 编译V8
参考: http://blog.csdn.net/andr0id/article/details/50067817 http://www.jb51.net/article/70608.htm1.下载V8源码: https://github.com/objcode/v8之所以没有下载git上的库,是因为按照网上搜的教程,生成VS项目的过程太复杂,要下载很多依赖项,太麻烦。使用svn上的库相对简单
2016-10-06 19:32:40
912
转载 深入探究透视投影
http://wenku.baidu.com/view/524f634a336c1eb91a375d41.html?re=view
2016-09-29 22:20:26
425
原创 JNI引用C++dll若干问题总结-如何导出C++中的类成员函数
最近做项目使用JNI引用C++的dll,在此记录遇到的问题。1.如何导出C++中的类 大家都知道JNI只能导出全局函数,至少我搜索了好久都没看到过有导出类的,貌似不可以。当然如果可以就更好了。那么既然使用的是C++语言,如果不使用类的话,那还不如直接使用C。总之,面向对象编程就是比面向过程”艺术”。所以就遇到个问题,C++类中的成员函数如何使用JNI导出?JNI只能导出全局函数。所以,我们可以采用
2016-09-14 13:51:47
1342
GameEngine02
2018-07-27
GameEngine01
2018-07-27
apk反编译:获取素材或者源代码
2017-07-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人