自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (1)
  • 收藏
  • 关注

原创 强大易用的Excel转Json工具

好久没更新了,最近配置json文件的时候发现以前用的excel转json转换器不好用了,上网找了几个都不能满足需求,于是自己用python写了一个。工具不复杂,使用简单,但能满足几乎所有excel转json的要求了,包括多层嵌套,每一层定制为列表或者字典的输出格式,复杂单元格的定制。转载请注明出处:https://blog.csdn.net/ylbs110/article/details/506...

2018-09-18 12:18:18 21538 9

原创 Unity设计模式:观察者模式

初学编程的时候内容比较少没有数据交互,等内容多到需要多个文件多个类协同运行的时候就涉及到类之间的数据交互了。比较简单的数据交互是这些类之间互相引用,直接或间接传值或调用,但是这样类之间的耦合性太高了,如果项目复杂且经常变动,类之间的引用关系可能会让开发人员陷入一团乱麻无法下手。尤其是有些不同模块不同人开发,互相之间需要相应事件的时候…… 这种情况下就需要观察者模式了。 顾名思义,观察者模式就是设

2016-12-31 08:36:13 2184 2

原创 Unity设计模式:享元模式

游戏中经常需要用到大量只是参数(比如坐标,旋转角,尺寸,颜色等)有些不同的重复物体,如植物,子弹,粒子等。如果数量非常多,在一个场景中逐一绘制这些对象将会消耗大量的性能。在学习OpenGL的时候我们知道有个实例化的方式,可以在一瞬间绘制数十万个仅仅位置不同的同一个对象而且并不会对GPU造成很高的负担,在实际开发中怎么使用这个方法来提升性能呢?享元模式可以做到这一点。享元模式的基本思路尽量少向GPU发

2016-12-24 20:33:17 1726 2

原创 Unity设计模式:命令模式

最近读了《游戏编程模式》,受到很多启发。虽然之前也读过设计模式的书,但是基本看过就忘了,实际开发中也很难和它们建立联系。这本书从实际应用出发讲解了游戏开发中常用的设计模式,很适合有一定开发经验但是不太会用设计模式的开发者。 为了学以致用,我在Unity中将几种基本的设计模式实现出来了,下面从第一个设计模式命令模式开始。1. 定义书中的定义是:命令就是面向对象化的回调。 好像还是有些抽象。简单来说

2016-12-17 11:52:27 3994 1

原创 UnityShader:选择Pass渲染通道

上一篇博客讲了MRT多重渲染,这篇接着学习通过一个shader输出不同效果的另一种方法——指定不同的渲染通道。渲染通道在unity Shader中就是SubShader中的Pass。之前的shader中都只有一个Pass,也就是单通道渲染,这样的话如果要对同一个RenderTexture在不同的时刻进行不同的渲染效果输出就需要不停的更换shader。当然,也可以使用多重渲染,但是如果一次只用一个效果

2016-12-10 19:26:53 18498 2

原创 UnityShader:MRT多重渲染

UnityShader:深度图获取,屏幕后期处理特效 中学习了如何使用unityshader处理摄像机画面,这次来看看多重渲染的使用。 有时候我们想同时获得一个画面的不同后期效果:比如需要同时显示深度图,RGB,像素化等,但是又不想进行多次处理浪费性能,这时候我们就需要多重渲染技术了,通过多重渲染技术,只需要一次就可以将我们想要处理的画面处理成我们需要的多种效果并输出。一、 多重渲染shader

2016-12-04 22:54:33 12054 1

原创 UnityShader:摄像机深度图获取,屏幕分割,变形

最近由于公司业务需要,需要输出深度图,并且游戏最终画面效果要同时输出RGB图和深度图,并分别占据屏幕不同的比例。之前公司同事的做法是用一个相机获取RGB,另一个相机获取深度图(需要用shader对画面进行后期处理),然后相机在屏幕显示比例不同达到最终要求。效果是可行的,但是总感觉很别扭,过于复杂。实际上shader能够输出深度图,本身又有RGB数据,理论上可以用算法一次输出最终分割效果,试了试果然成

2016-11-27 19:21:55 13501 7

翻译 (译)LearnOpenGL实际案例Breakout(十二):渲染文本

英文原文 在这篇教程的最后我们通过添加一个生命值系统来作为最后一个系统,一个胜利条件和来自文本渲染的反馈。这个教程严重依赖于之前介绍的文本渲染教程,因此如果你没准备好,非常建议你从那篇教程开始。 在Breakout中所有文本渲染脚本被封装到TextRenderer类中,它的特性基于FreeType库的渲染特性和真实的渲染代码。你能在这里找到TextRenderer类: TextRenderer

2016-11-20 19:39:20 1262 2

翻译 (译)LearnOpenGL实际案例Breakout(十一):音频

英文原文 无论我们多么努力的打造游戏的内容我们很可能不会从游戏中听到任何声音;我们有如此多的内容来显示,但是没有音频游戏仍然感觉有一些单薄。在这个教程中我们将会改善它。 OpenGL不提供给我们任何支持音频的能力(和其他游戏开发相似)。我们必须手动加载音频文件为比特流,处理并且转换他们为音频流并且管理多个音频流方便在我们的游戏中使用。这有一些难懂并且需要一些音频工程的基础知识。 如果从几个音频

2016-11-13 17:06:06 899

翻译 (译)LearnOpenGL实际案例Breakout(十):能量块

英文原文 Breakout已经接近尾声了,但是它仍然可以通过添加一个额外的游戏内容来变得更酷,这样它就不是普通的Breakout的翻版;能量块怎么样? 这个主意就是无论何时砖块被销毁,这个砖块会有一个小概率产生一个能量块。这样一个块将会缓慢落到底部并且如果它碰撞玩家挡板,一个基于能量块类型的有趣的效果将会产生。例如,一个能量块让挡板更大,另一个能量块允许小球穿透物体。我们还有几个负面能量块来对玩

2016-11-06 20:21:26 1034

翻译 (译)LearnOpenGL实际案例Breakout(九):后期处理

英文原文 如果我们能够在Breakout游戏中加一点后期图形特效会更有趣吗?我们能够创建一些模糊晃动效果,反转场景中所有的颜色,实现一些疯狂的顶点偏移和/或做一些能想到的其他的和帧缓存有关的有趣的效果。 在帧缓存教程中我们演示了如何通过后期效果仅仅使用一个简单的贴图来实现有趣的效果。在Breakout中我们准备做一些类似的事情:我们准备从多个样本渲染缓存对象中创建一个帧缓存对象来作为他的颜色附件

2016-10-30 23:07:08 903

翻译 (译)LearnOpenGL实际案例Breakout(八):粒子

英文原文一个微粒,从OpenGL的角度看就是一个总是面向摄像机方向且(通常)包含一个大部分区域是透明的纹理的小四边形.一个微粒本身主要就是一个精灵(sprite),前面我们已经早就使用过了,但是当你把成千上万个这些微粒放在一起的时候,就可以创造出令人疯狂的效果. 当处理这些微粒的时候,通常是由一个叫做粒子发射器或粒子生成器的东西完成的,从这个地方,持续不断的产生新的微粒并且旧的微粒随着时间逐渐消亡

2016-10-23 08:53:04 963 1

翻译 (译)LearnOpenGL实际案例Breakout(七):碰撞反馈

英文原文1. 碰撞反馈在教程的最后我们有一个运行的碰撞检测方案。然而,小球在碰撞检测中仍然没有任何反馈;它仅仅直接穿透了所有的砖块。我们想要小球在碰撞砖块时防水功能反弹。这个教程讨论了在AABB和圆形碰撞检测之间的碰撞反馈算法。 无论什么时候发生碰撞,我们需要发生两件事:我们需要重置小球这样它就不再进入其他对象,我们想要改变小球的方向和速度这样它看起来被对象弹开了。碰撞重定位将小球对象放置在在碰

2016-10-16 16:06:49 2124

翻译 (译)LearnOpenGL实际案例Breakout(六):碰撞检测

英文原文当尝试检测碰撞是否在两个对象之间发生的时候,我们通常不使用对象自己的数据除非这个对象很复杂;这反过来让碰撞检测变得复杂。出于这个原因,我们通常练习的时候更多的使用简单的形状(常常有很好的数学上的定义)覆盖在原始对象上方来碰撞检测。然后我们基于这些简单的形状来让我们的代码更简单并且省下很多性能。这样的一些例子是圆形,球星,三角形和方形;这些用起来比有上百个三角形的网格简单。 当他们给我们更加

2016-10-08 21:34:20 3297 1

翻译 (译)LearnOpenGL实际案例Breakout(五):小球

英文原文现在我们有一个砖块的关卡和一个可移动的玩家挡板。和经典Breakout唯一缺失的是小球。目标是让小球碰撞所有的砖块直到每一个可破坏的砖块被破坏,但是这有一个条件是小球不能触碰屏幕的底部边缘。 撇开一般的游戏组件对象,一个小球有一个半径和一个标识出小球是卡在挡板上还是可以自由移动的额外的bool值。当游戏开始,小球最初被卡在玩家挡板上直到玩家按下任意键开始游戏。 因为小球是有一些额外特性的

2016-10-02 07:44:41 1074

翻译 (译)LearnOpenGL实际案例Breakout(四):关卡

之前一直更新的实际上是LearnOpenGL的笔记,说起来没什么价值,还不如直接去看原文 LearnOpenGL英文版最后有一个实际小游戏打砖块,中文部分只翻译了部分内容。为了更好的学习,我将剩下的部分翻译出来,英语水平一般,仅供参考。 英文链接 以下是翻译部分:不幸的是Breakout并不仅仅是一个绿色笑脸,还包含了有一大堆好玩的彩色砖块的完整关卡。我们想要这些关卡变得灵活多样这样他们就能够

2016-09-25 19:24:43 1224 1

原创 LearnOpenGL学习笔记9:材质

一、 材质通过为每个元素指定一个颜色,我们已经对物体的颜色输出有了精密的控制。现在把一个镜面高光元素添加到这三个颜色里,这是我们需要的所有材质属性:#version 330 corestruct Material{ vec3 ambient; vec3 diffuse; vec3 specular; float shininess;};uniform Mat

2016-09-17 22:12:35 2047

原创 LearnOpenGL学习笔记8:光照基础

一、 颜色当我们把光源的颜色与物体的颜色相乘,所得到的就是这个物体所反射该光源的颜色(也就是我们感知到的颜色)。二、 光照基础光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个元素组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。这些光照元素看起来像下面这样:

2016-09-11 20:13:33 773 1

原创 LearnOpenGL学习笔记7:摄像机

一、 摄像机1. 摄像机/观察空间定义一个摄像机,我们需要一个摄像机在世界空间中的位置、观察的方向、一个指向它的右测的向量以及一个指向它上方的向量。 摄像机的位置 获取摄像机位置很简单。摄像机位置简单来说就是世界空间中代表摄像机位置的向量。我们把摄像机位置设置为前面教程中的那个相同的位置:glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);摄像机

2016-09-11 20:02:29 1336

原创 LearnOpenGL学习笔记6:坐标

一、 坐标系统将坐标转换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步,也就是类似于流水线那样子,实现的,在流水线里面我们在将对象转换到屏幕空间之前会先将其转换到多个坐标系统(Coordinate System)。将对象的坐标转换到几个过渡坐标系(Intermediate Coordinate System)的优点在于,在这些特定的坐标系统中进行一些操作或运算更加方便和容易,这一点很快将会

2016-08-28 23:36:34 1060 1

原创 LearnOpenGL学习笔记5:变换

变换向量向量有一个方向(Direction)和大小(Magnitude,也叫做强度或长度)。向量可以在任意维度(Dimension)上。由于向量表示的是方向,起始于何处并不会改变它的值。我们通常设定这个方向的原点为(0,0,0),然后指向对应坐标的点,使其变为位置向量(Position Vector)来表示(你也可以把起点设置为其他的点。向量与标量运算标量(Scalar)只是一个数字(或者说是仅有一

2016-08-21 21:01:07 816

原创 LearnOpenGL学习笔记4:纹理

一、 纹理1. 基础纹理 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。除了图像以外,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上。 纹理坐标 纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样(译注:采集片段颜色)。纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。纹理坐标起始于(0,

2016-08-13 11:54:47 1523 1

原创 LearnOpenGL学习笔记3:着色器

一、 着色器1. GLSL一个典型的着色器有下面的结构:#version version_numberin type in_variable_name;in type in_variable_name;out type out_variable_name;uniform type uniform_name;int main(){ // 处理输入并进行一些图形操作 ...

2016-08-07 23:14:44 2863 4

原创 LearnOpenGL学习笔记2:绘制基础图形

笔记摘自:https://learnopengl-cn.github.io/ 侵删 一、 基础 1. 渲染流程 3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。管线:Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程。它可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D

2016-07-30 20:30:39 11020

原创 LearnOpenGL学习笔记1:创建窗口

学了一段时间的编程指南第8版,发现这工具书一般的书并不适合新手自学,于是上网找到了一套更适合学习的教程:https://learnopengl-cn.github.io/ 从现在开始先把这套教程学完,再回头看指南。一、 库1. GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,

2016-07-23 15:22:55 2151 1

原创 OpenGL学习笔记6:高级纹理知识

矩形纹理纹理目标为GL_TEXTURE_RECTANGLE。 首选,矩形纹理不能进行Mip贴图; 然后,矩形纹理不是标准化的(实际上是对像素寻址) 最后,纹理坐标不能重复,并且不支持纹理压缩加载矩形纹理bool LoadTGATextureRect(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMo

2016-07-16 20:03:43 4807

原创 OpenGL学习笔记5:着色器

初识着色器语言变量和数据类型可用的数据类型只有4种:有符号整数,无符号整数,浮点数,布尔值。 OpenGL着色语言中没有指针和字符串或字符。返回值可以为void。向量类型所有4种基本数据类型都可以存储在二维、三维或者四维向量中: OpenGL着色语言向量数据类型 类型 描述 vec2,vec3,vec4 2分量、3分量和4分量浮点向量 ivec2,ivec3,ivec4 2

2016-07-09 20:25:17 15278 4

原创 OpenGL学习笔记4:纹理

原始图像数据像素包装图像数据在内存中很少以紧密包装的形式存在。在许多硬件平台上,处于性能上的考虑,一幅图像的每一行都应该从一种特定字节对齐地址开始。绝大多数编译器会自动把变量和缓冲区放置在一个针对该架构对齐优化的地址上。 例如一个包含3个分量的rgb图像,每个分量存储在一个字节中,如果图像有199个像素,那么一行需要597个像素。如果硬件本身的体系结构是4字节排列,那么图像每一行的末尾将由额外的3

2016-06-30 22:33:27 8288 1

原创 OpenGL学习笔记3:变换,矩阵,更多对象

变换进行图形开发,3D图形数学基础是必不可少,限于其专业性,OpenGL笔记里不做详细赘述。但是对相关术语及其在OpenGL对应的内容还是需要一定的了解。基础向量点乘 两个(三分量)单位向量之间的点乘运算将得到一个标量(只有一个值),它表示两个向量之间的夹角。要进行这种运算,这两个向量必须为单位长度,而返回的结果将在-1.0到1.0之间。这个数字实际上就是这两个向量之间夹角的余弦值。 我们可以使

2016-06-25 20:58:50 8591 3

原创 OpenGL学习笔记2:绘制和混合

绘制OpenGL几何图元在使用OpenGL在计算机屏幕上进行绘图时不需要从一个点的绘制开始。我们关心的不是物理屏幕坐标和像素,而是视景体中的位置坐标,我们将从7个由定义的几何图元来开始绘制实心几何图形: 图元 描述 GL_POINTS 每个顶点在屏幕上都是一个单独的点 GL_LINES 每一对顶点定义了一个线段 GL_LINE_STRIP 一个从第一个顶点依次经过每个后

2016-06-18 19:08:06 3803 1

原创 OpenGL学习笔记1:环境配置和基本流程

虽然游戏引擎能够满足游戏开发的绝大部分需求,但是如果仅仅会使用引擎而不懂得游戏引擎的运作原理和图形处理原理,势必会沦为引擎的奴隶。为了让自己不仅能够知其然,还要能知其所以然,决定从OpenGL开始研究图形学和游戏引擎开发技术。前面还有很长的路,慢慢来。环境配置和往常一样,还没开始研究OpenGL就开始在网上找OpenGL的库,结果找了好久都没找到最新的库,官网上也都是文档(如果谁有最新的库希望能共享

2016-06-12 20:27:41 1308

原创 哈弗曼编码实现文件压缩和解压缩

原理哈弗曼编码的本质是将文件中出现频率越高的字符用越短的二进制码代替从而达到节省空间的目的。为了达到这个目的,需要构建哈夫曼树。 哈弗曼树的构建过程为: 1. 将源文件所有字符及其出现次数构建哈弗曼节点 2. 将权值最小的两个节点作为左右叶子节点组成一个新的哈弗曼节点来替代原哈弗曼节点集合中的这两个节点 3. 重复步骤2直至只剩一个哈弗曼节点,则该节点为哈夫曼树 而每个节点的哈弗曼编

2016-06-05 17:29:24 3705 1

原创 二叉树的非递归插入和遍历

需求二叉树是一种常见的适合使用递归进行遍历的数据结构,但是如同绝大多数递归操作,二叉树的遍历也可以使用非递归的方式来实现,研究二叉树的非递归实现有助于更好的掌握二叉树的结构和使用方式。 递归好是好,只是太无脑。只会用递归解自循环数据就像只会用方程组解应用题那样,丧失了对数据结构本质的解析能力。实现 上图所示是一个简单的二叉树的示意图。如果要对上述二叉树进行中序遍历,我们应该先对根节点的左子树(如

2016-05-28 22:19:12 3828

原创 C++模板

关于模板,网上这篇写的比较详细: http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html 我这里仅简要写一下用法,方便快速学习。需求我们可以通过函数的重载以及指向函数的指针来实现函数的多态,C#里面还可以使用委托和事件来更方便的达到这个效果。但是毕竟重载太麻烦,相同的逻辑要写多次;指针无法解决参数类型的问题;如果你要封装一个类,他

2016-05-22 11:43:13 408

原创 C++多维数组形参

需求今天在学习数据结构和算法时遇到一个需要传递多维数组形参的问题。问题本身很简单,向方法传递一个二维数组,但是使用的时候为了能够让数组维度值能够动态可变(比如向同一个方法传递3X3矩阵或者4X4矩阵),也还是费了些脑子。实现一维数组看多维数组形参传递之前我们先看看简单的一维数组。void arrTest(int arr[2]){ cout << sizeof(arr) << endl;}这

2016-05-13 22:14:30 2350

原创 C++版简单线程池

需求之前写过一个C#版本的简单线程池http://blog.csdn.net/ylbs110/article/details/51224979 由于刚刚学习了C++11新特性中的future,于是想到用它来实现一个线程池。实现思路基本和C#版本的一样,主要区别是委托的实现,线程句柄的不同和线程锁:本来C++有function模板,但是实现起来比较麻烦,这里主要是实现线程池,所以动态参数的委托就不

2016-05-07 13:45:15 1666 1

原创 C# 自定义Json解析工具

需求需求内容还是上一篇公司那个java转C#的需求,其中socket是json格式的。需求中的这个json需要能够动态增删json数据中的元素:每条数据的key和value都是动态定义的,解析出来才知道收到哪些key和value,而且有些value本身又是json数据,也就是说json数据嵌套。 需求并不复杂,但是找了找并没有找到好的json序列化和反序列化工具,.NET自带的运行时序列化和反序列

2016-04-29 11:13:43 2550 2

原创 改进版的线程池(仿java的ScheduledFuture)

需求上一篇写了一个线程池http://blog.csdn.net/ylbs110/article/details/51172428 经过仔细查询javaAPI才发现我前面一个方案并不符合要求:java中的newSingleThreadScheduledExecutor是个单线程池,也就是说一直只有一个线程在跑,新添加的任务会存储起来,线程每次跑完一个任务再获取一个新任务继续跑,没有任务则等待任务。

2016-04-23 10:18:49 3130 2

原创 一个简单的线程池(仿java的ScheduledFuture)

需求最近公司有一个奇葩的需求:让我把一个java的客户端插件转换为C#版本。 转换并不难,由于有java客户端的源码,基本只要照着“翻译”即可实现,实际上我是将java代码复制到C#工程中然后通过改bug的方式实现的。 由于java和C#很相似,这个干问题并不大,但是有几个java的库C#并没有。而且由于我想要将C#的DLL放到Unity中使用,所以没办法使用高版本的.NET库,导致我需要手动实

2016-04-17 11:33:53 1661 2

原创 C++右值引用

需求通读完了C++Primer,有很多问题困扰着我。这其中,除了万年老大难的指针外,还有一个被多次提到的知识点:左值引用和右值引用。 虽然在C++98中左值引用和右值引用对程序员来说处于透明状态,基本无需太过操心,但在C++11的新特性中,它们的区别却不得不引起我们的注意。是什么左值和右值在谈左值引用和右值引用之前,我们先来看看另外两个与之紧密相关的知识点:左值和右值。 网上这一篇讲得不错:ht

2016-04-09 17:07:54 679 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除