- 博客(93)
- 资源 (1)
- 收藏
- 关注
原创 C++ 智能指针
控制块通过继承实现,内部使用了虚函数,shared_ptr内部存储的是基类的指针,与实际的控制块类型无关。如果基类和派生类都继承了enable_shared_from_this会导致shared_ptr识别类型失败,而无法使用shared_from_this。strong_ref是shared_ptr的引用计数,当前strong_ref变为0时会调用对象的析构函数,但不一定会释放对象的内存,weak_ref是weak_ptr的引用计数,当shared_ptr和weak_ref都为0时则会释放控制块的内存。
2024-03-14 20:59:19 1096
原创 Vulkan RenderPass
RenderPass从名字就可以看出是与渲染相关的,非渲染的任务则不需要使用RenderPass,例如:计算着色器就不需要RenderPass。RenderPass渲染时用于设置FrameBuffer的格式,以及subpass。创建FrameBuffer和GraphicsPipeline时需要提供一个RenderPass对象。
2024-01-10 21:18:16 1196
原创 Vulkan Synchronization 同步
Vulkan同步会将Command分成前面的和后面的两个部分,同步主要是用于控制后面的Command执行顺序,以及后面的Command读取到最新的数据。
2024-01-09 20:26:56 1179
原创 OpenGL Context
OpenGL Context与窗口系统相关,所以在不同平台上创建方式都不一样。EGL 是OpenGL官方Khronos推出的,既可以使用用于OpenGL Context,也可以用于OpenGL ES Context。Google的项目使用了EGL,支持各个平台,提供将OpenGL ES/WebGL转译为Vulkan、DirectX、Metal 等系统的图像API,Chrome浏览器中的WebGL使用了ANGLE。
2023-12-16 12:39:32 285
原创 C++ 内存模型 Memory Model
现在CPU都是多核结构,每个核心都有自己的一级缓存,二级缓存,以及共享的三级缓存。如下图,其中一级缓存分为指令缓存IL1和数据缓存DL1,二级缓存L2 256kB,三级缓存 L3 8MB。从上图可以看出L3比L2大得多,但是L3离核心比较远,访问速度比较慢,L3后面则是与内存相连。当CPU核心要读取内存数据时,需要先从内存读取到L3,再到L2,再到L1.....。因CPU有多个核心,所以可以同时并行多个线程。
2023-09-13 21:15:42 441
原创 C++ 构造函数、析构函数调用虚函数
C++虚函数是通过虚表实现的,虚函数的地址记录在需表中,只对象完成构造完成后,虚函数的地址才最终确定。基类先于派生类构造,所以构造时没法调用到派生类的虚函数,也就是说只能调用到自己,也就是虚函数失去多态功能。派生类先于基类析构,所以析构时基类没法调用到派生类的虚函数,同样只能调用到自己,虚函数也失去多态功能。运行结果:在构造函数函数或者析构函数中调用虚函数,通常IDE会有警告,为了消除警告可以通过域名符号调用虚函数,此时相当于直接指定函数地址,不需要通过虚表所以不会有警告。
2023-08-30 22:04:41 652
原创 Windows上使用dump文件调试
dump文件记录当前程序运行某一时刻的信息,包括内存,线程,线程栈,变量等等,相当于调试程序时运行到某个断点上,把程序运行的信息记录下来。可以通过Windbg打开dump,查看程序运行的变量等,来调试程序。
2023-08-17 23:18:28 3113
原创 CMAKE编译输出目录
如果有编译和调用动态库,需要设置动态库的输出位置,否则运行时可能会出现找不到动态库,特别时MSVC生成的DLL。可以通过以下方式设置DLL的输出位置。这样所有的输出都会到指定目录。
2023-04-18 23:04:57 4671
原创 编译错误:rpcndr.h(192,14): error C2872: “byte”: 不明确的符号
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\rpcndr.h(192,14): error C2872: “byte”: 不明确的符号
2023-03-08 12:11:11 7641 3
原创 Git 多个账户,多个SSH配置
Git 多个账户,多个SSH配置能搜索多个Git账户配置,应该会单个Git账户的配置,这里只是多个账户的配置,单个账户的配置,请直接百度“Git配置“。之所以要写这篇文章是因为,百度上” Git 多个账户配置“,很乱,很多错误。如果你有多个Git账号,可能就需要配置多个SSH,以对应不同的账户。为什么说“可能“呢?因为如果你是公司gitlab、github、gitee分别有一个账号,...
2020-05-05 17:01:15 4365
原创 OpenGL显示文字
阅读这篇文章前,可以先看一下这个文字显示系列的其他文章,了解一些字符编码,字体相关的知识:https://blog.csdn.net/wlk1229/article/category/9008450显示文字OpenGL提供的是图形API,本身并不提供文字处理方面的接口,如果想要显示文字就需要先将文字转化成图片,然后渲染图片。Char MapChar Map是最简单的方式,首先...
2019-06-23 19:33:06 11957
原创 文字显示4——创建并使用字体
这个系列前三文章:文字显示1——字符与编码文字显示2——C++字符串与字符编码文字显示3——字体创建并使用字体创建字体通过High-Logic FontCreator软件可以很容易的创建我们自己的字体。字体绘制区域如上图所示我们在设计字体时只能在一定区域内设计字符,如果超出范围字符显示时会与其他文字重叠。绘制范围如上图所示,上下不能超过WinAscent/...
2019-06-16 20:11:25 1388
原创 文字显示3——字体
这个系列前两文章:文字显示1——字符与编码文字显示2——C++字符串与字符编码字体字符编码后只是一个数字,当要显示一个字体时,就需要用到字体,我们需要根据字符从字体种取出对应的图片信息,然后显示。字体类型点阵字体与轮廓字体最早的字体是点阵字体,点阵字体通过一个点阵上的点来描述字体,如下图,分别时16*16和24*24点阵表示“点”字。点阵字体有...
2019-06-16 10:07:39 1376
原创 文字显示2——C++字符串与字符编码
在看这篇文章之前,最好先看一下上一篇文章:文字显示1——字符与编码C++字符串与字符编码目前大部分编程语言字符串默认使用的是Unicode,比如Java,C#,JavaScript等等,大部分情况不需要考虑字符编码问题。在C/C++中char为一个字节,最初是用于存储ASCII字符,当然也可以存储中文字符,对于中文字符需要两个char才能存储一个字符。C++中的char也可以用来存储...
2019-06-09 22:03:37 2264
原创 文字显示1——字符与编码
字符与编码对于文字,实际上只是图形符号,每一个字符对应一个符号,英文单词为glyph。对于计算机来说处理图形符号并不容易,但是处理数字却非常简单,因此可以将字符转换成数字,然后直接处理数字就行。例如:可以用数字1代表字符‘a’,当在处理字符时如果遇到数字1就直接在屏幕上绘制一个‘a’图形符号就行。当把一个语言中所有的字符都用一个独一无二的数字表示时,这个过程就是编码。例如在ASCII表中使用数...
2019-06-04 20:39:41 1493 1
原创 Cocos2d-x 实时动态阴影
Cocos2d-x 实时动态阴影声明:本文使用的是cocos2d-x-3.17的代码本文特效需要用到以下知识Cocos2d摄像机详解 Cocos2d-x 着色器 Cocos2d-x 3D模型渲染在Cocos2d-x-3.17的CPP Tests测试例子中有一个“假”阴影的例子,这个例子通过计算精灵在平面的位置,然后绘制一个圆形的黑色图片做为精灵的影子,如下图:这种实现方式...
2019-02-17 22:21:58 3363 1
原创 Cocos2d-x 镜子特效
Cocos2d-x 镜子特效声明:本文使用的是cocos2d-x-3.17的代码实现镜子特效需要用到以下知识Cocos2d摄像机详解 Cocos2d-x 着色器 Cocos2d-x 3D模型渲染镜子特效的原理很简单,就是镜子为轴对称,将镜子正面的物体在背面重新绘制一次。绘制物体时需要解决两个问题,首先需要确定物体的位置,其次是要保证物体绘制时不能超出镜子的范围。确定反射位置...
2019-01-28 23:19:02 907
原创 Portal Rendering与镜子特效
Portal Rendering与镜子特效Portal Rendering,之前在网上看到过有人翻译成视口渲染。Portal Rendering有点类似于漫威电影里面奇异博士的传送门, 透过传送门可以看到另一个地方的物体,如下图:对于Portal Rendering,我们需要定义两个Portal,一个用于取景,一个用于显示取景,通过显示Portal可以看到,取景的物体,如下图:...
2019-01-28 21:11:29 710
原创 使用IO完成端口IOCP与线程池创建高性能服务器
使用IO完成端口IOCP与线程池创建高性能服务器在使用socket网络编程,实现一个服务器时,初学者最容易想到方法是当服务器监听的socket接受(accept)到一个客户端时创建一个线程,然后在线程中调用recv函数实时监控客户端是否有数据发送过来。这种方法是可以实现服务器对客户端数据的监听,但是这种方法效率很低,无法支持大量客户端同时连接。这种方法需要对每个连接的客户端创建一个线程,如果有...
2019-01-21 23:25:27 4067 2
原创 OpenGL纹理坐标 与 Cocos2d-x 纹理坐标
Cocos2d-x 纹理坐标声明:本文使用的是cocos2d-x-3.17的代码OpenGL纹理坐标在OpenGL中2D纹理坐标系如下:原点为左下角,向右为X轴正方向,向上为Y轴正方向。纹理数据排列创建一个2*2的二维纹理,需要四个像素,以下是4个像素的数据 floattexData[]={1.0,0.0,0.0,1.0, ...
2018-12-18 20:27:10 1971 2
原创 VS2015导出带文件的项目模板
VS2015导出带文件的项目模板VS2015可以导出项目模板和项模板,有项目模板时,当创建新项目不用每次重新搭建项目,只需要直接创建就行。 导出项目模板创建好一个项目作为模板 “文件”->“导出模板”,选着“项目模板”,完成 3. 导出完成后创建项目时就会有相应的模板, 模板中加入文件上面创建的模板创建的项目只会有项目文件,不会包含之前项目中的代码...
2018-12-15 19:53:25 2796 1
原创 Cocos2d-x 立方体纹理与环境映射
Cocos2d-x 立方体纹理声明:本文使用的是cocos2d-x-3.17的代码文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy立方体纹理Cube Texture从名字来看就知道这是一个立方体,初始化一个立方体纹理需要使用六张图片设置立方体的六个面。立方体纹理需要使用3D坐标系定位,六个面分别是X轴正方向、X轴负方向...
2018-12-09 11:19:42 878 3
原创 向量投影与向量投影矩阵
向量投影与向量投影矩阵向量投影以下是向量a在向量b上的投影,θ 为两向量的夹角。其中a = a||+a⊥,a||则是a在b上的投影。 所以投影公式如下:向量投影矩阵将以上投影公式写成矩阵形式,这里使用的是列优先的矩阵,即向量写成一列多行。因为矩阵相乘符和结合律,所以: 是一个矩阵,如果是二维向量则是2*2的矩阵,如果是三...
2018-12-03 21:03:11 32273
原创 Cocos2d-x 2D粒子系统详解
Cocos2d-x 2D粒子系统声明:本文使用的是cocos2d-x-3.17的代码文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy这里分析的是Cocos2d中的2d粒子系统,包括粒子系统中的各个参数,以及粒子的更新,粒子的运动。Cocos2d-x中类ParticleSystem实现了对粒子的控制,类ParticleS...
2018-12-02 20:39:36 3832 1
原创 Cocos2d-x 着色器
Cocos2d-x 着色器声明:本文使用的是cocos2d-x-3.17的代码文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy 着色器GLProgramCocos2d-x 3中所有的渲染都使用了可编程管线,通过着色器进行渲染。Cocos2d-x底层使用的是OpenGL,对应的着色器语言为GLSL。Cocos2d...
2018-11-15 19:04:03 1841
原创 骨骼动画原理与Cocos2d骨骼动画
骨骼动画原理与Cocos2d骨骼动画声明:本文使用的是cocos2d-x-3.17的代码文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy蒙皮骨骼动画蒙皮骨骼动画可以分为两部分,蒙皮Skinned Mesh和骨骼Bone。蒙皮指的是所有的点,骨骼可以控制点的位置,从而形成不同的“姿势”。如下图,图片是使用MeshVi...
2018-11-11 21:44:22 9129 1
原创 Cocos2d-x 3D模型渲染
Cocos2d-x 3D模型渲染声明:本文使用的是cocos2d-x-3.17的代码文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy3D模型Cocos2d支持渲染*.fbx和*.obj两种3D模型,*.obj模型可以直接渲染,*.fbx模型需要先使用官方的转换程序fbx-conv.exe转换成*.c3t或者*.c3...
2018-11-11 20:40:44 5668 2
原创 Cocos2d-x 渲染器Renderer与6种RenderCommand详解
Cocos2d-x 渲染器Renderer声明:本文使用的是cocos2d-x-3.17的代码文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy在《Cocos场景遍历与渲染》中已讲解了Cocos2d 在渲染时会先遍历场景,遍历时会生成渲染命令,渲染器再处理渲染命令绘制出图形。这篇文章主要是讲解渲染器如何处理渲染命令...
2018-10-21 12:08:10 4659
原创 Cocos2d摄像机详解
Cocos2d摄像机详解摄像机的作用在3D系统中都会有一个摄像机的概念,物体在显示之前需要先将物体的坐标转换到视角坐标,也就是摄像机坐标,然后再投影,最后还需对投影画面进行缩放到视口显示的大小。Coscos2d-x 3.x支持3D的,所以其肯定会有摄像机。在Cocos中摄像机由类Camera实现,主要作用有3个:1、设置视口,2、将全局坐标转换到摄像机坐标中,3、投影。 设置视口...
2018-09-17 22:32:47 5284
原创 Cocos2d-x 坐标系统详解
Cocos2d-x 坐标系统详解声明:本文使用的是cocos2d-x-3.17的代码本文将详细介绍Cocos2d中的坐标系统,分析坐标系统中的坐标转换。Cocos2d-x 3.X支持3D功能,Cocos2d中的坐标系统也是3维,如果想彻底理解Cocs2d的坐标系统,需要一些3D图形学的知识,需要理解3D系统中的坐标转换。全局坐标与局部坐标2d坐标系统是3D坐标系统的一个子集,...
2018-09-10 23:02:32 1544
原创 OpenGL 编程指南(第八版)学习笔记——12 计算着色器
OpenGL 编程指南学习资料以及我整理的代码下载地址https://pan.baidu.com/s/1bqrcspD文中提到的代码为下载文件中的“OpenGL编程指南 VS2015代码.zip”文件,代码也可以到github上下载:https://github.com/Kylewlk/OpenGL-Programming-Guide-8th-Edition-Code 12 计算着色器...
2018-08-19 16:06:48 1577 1
原创 OpenGL 编程指南(第八版)学习笔记——11 内存
OpenGL 编程指南学习资料以及我整理的代码下载地址https://pan.baidu.com/s/1bqrcspD文中提到的代码为下载文件中的“OpenGL编程指南 VS2015代码.zip”文件,代码也可以到github上下载:https://github.com/Kylewlk/OpenGL-Programming-Guide-8th-Edition-Code 11 内存纹...
2018-08-19 16:02:59 562
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人