
游戏开发
文章平均质量分 73
Gary的面包屑小道
这个作者很懒,什么都没留下…
展开
-
客户端面试知识点总结
最近通过自己的面试,计划进入新的一家公司进行工作,中间面试的过程中也发现了自己的一些不足,因为有一些知识点在工作中用到的机会不会很多,就会有一些遗忘,所以自己也是一边总结一边面试,将自己每一次...原创 2021-06-07 16:20:01 · 2628 阅读 · 5 评论 -
细数Android原生工程接入EasyAR-SurfaceTracking遇到的坑
背景:该篇文章总结于在原生的工程中接入EasyAR的SurfaceTracking的过程中遇到的一些问题,有一些问题是知识性的问题,有一些问题是可以称之为是坑的问题。关键词:Android原生中有关OpenGL的渲染设置EasyAR初始化失败EasyAR照相机黑屏在Android Studio中进行有关EasyAR矩阵的调试(矩阵数据变的很诡异)如何在自己的引擎中进行设置E...原创 2020-01-11 14:37:46 · 1407 阅读 · 6 评论 -
Direct库中找不到 DirectX Texture Tool
在Direct3D的书中看到有DirectX Texture Tool的描述,指定了其在SDK中的路径。可是到了该路径下却找不到有叫DirectX Texture Tool的可执行文件。后来发现,原来是DxTex.exe 文章出处:https://blog.youkuaiyun.com/o_oxo_o/article/details/17362965...转载 2018-11-23 11:33:04 · 930 阅读 · 2 评论 -
什么是DirectX
因为最近一直在看DirectX9的有关基础,以此来熟悉一下基础的游戏开发概念,但是基础的概念熟悉了,有关的发展信息也是要熟悉一下,但是一直很模糊,相信初次接触游戏开发的朋友有听过DX,OpenGL,Metal 3D等,但是又不是很清楚他们之间的区别和联系,最近在某乎看到一个回答,觉得很不错,和大家分享一下。1、DirectX 是什么?OpenGL,直译过来就是,开放的图形库(Open Gra...原创 2019-02-02 10:52:45 · 1277 阅读 · 0 评论 -
DirectX中的粒子系统
自然界中有现象包含了大量的行为相同的,微小粒子,比如:雪花,烟火等,粒子系统通常用来描述这些场景。粒子是自然界中一种微小的东西,所以显示例子的最好的方法就是使用点图元,但是点图元在被光栅化的时候会被映射为一个像素,此时我们就无法去灵活的操作他,因为我们要去经常的改变他的大小,或者去给这个图元映射纹理。很早之前有一个技术叫做:广告牌,广告牌就是一个四边形,通过控制他的世界矩阵,来使其总面向摄影机...原创 2019-02-15 09:50:51 · 690 阅读 · 0 评论 -
粒子系统的绘制
粒子系统在上一篇博客中简单介绍了一下:DirectX中的粒子系统现在我们知道,粒子系统是动态的,我们必须每一帧都去更新这个粒子系统,有一种直观但是效率不高的方法如下:1、更新所有粒子的状态2、创建一个足够容纳粒子系统中最大粒子数目的顶点缓存3、将所有处于活动状态的粒子赋值到这个巨大的顶点缓存中去4、将顶点缓存中的粒子全部绘制出来该方法的效率不高的原因,其一是因为我们必须创建...原创 2019-02-15 16:12:39 · 370 阅读 · 0 评论 -
烟火的粒子系统实现介绍
之前的两篇博客介绍了粒子系统和粒子系统中的绘制:DirectX中的粒子系统和粒子系统的绘制其中介绍的也是粒子系统中比较通用的方法以及属性,但是具体的粒子系统还是需要根据自己的情况来添加一些新的方法,现在我们就来简单的看一下实现一个具体的烟火粒子系统(Firework)需要实现的具体的内容。Firework实现还是需要继承于基础的PSysstem类的。具体的PSystem的可以查看博客:...原创 2019-02-15 17:19:42 · 417 阅读 · 0 评论 -
DX9中的3D拾取
先来简单介绍一下有关3D拾取的相关概念。我们通常使用鼠标点击屏幕中的物体,然后当我们点中这个物体的时候,物体做出一些反应。比如在游戏中:我们点击地上的宝箱,然后当我们点击到宝箱上面的时候,宝箱打开,这就是一次拾取的过程。之前的博客有讲解过Direct3D中的绘制流水线,而现在我们现在接触的3D拾取和之前的绘制流水线基本是一次相反的过程,具体的博客链接在这里:DX9的绘制流水线。在三维场景中...原创 2019-02-17 21:29:00 · 678 阅读 · 0 评论 -
高级着色语言HLSL小入门
使用HLSL语言编写顶点着色器和像素着色器,顶点着色器和像素着色器本质使我们自己编写的定制程序,这些程序可以帮助我们取代功能流水线中的某一块功能,然后在图形卡的GPU中执行。通过这种变换,我们在实现图像效果的时候就有了更大的的灵活性。HLSL着色器程序可以以一个长字符串的形式出现在程序的源文件中,但是更模块化的做法是将着色器的代码和源程序的代码分离。龙书上面介绍是可以将着色器代码在记...原创 2019-02-18 16:38:54 · 1276 阅读 · 2 评论 -
着色器(Shader)之顶点着色器
顶点着色器其实就是我们自己编写的一段在GPU中运行的程序,有了顶点着色器,我们就可以从固定的功能流水线中代替一些模块,从而获得更多的顶点操作的灵活性。对于顶点位置进行操作的的能力具有广泛的应该场合:织物模拟、粒子系统的点尺寸处理等。可编程流水线中的顶点结构比固定的流水线具有更加丰富的数据。首先我们应该检测一下,硬件是否支持顶点着色器://如果设备支持的版本低于2.0版if(...原创 2019-02-18 20:02:54 · 5344 阅读 · 1 评论 -
着色器(Shader)之像素着色器
像素着色器实际上就是对每一个像素进行光栅化的处理期间,在GPU上运算的一段程序。不同与顶点着色器,像素着色器不会以软件的形式来模拟像素着色器。像素着色器实质上是取代了固定功能流水线中多重纹理的环节,而且赋予了我们访问单个像素以及访问每一个像素纹理坐标的能力多重纹理的概述多重纹理就是我们同时启用多层纹理,然后规定他们的融合方式,以得到特殊效果。多重纹理最典型的应用就是光照运算,...原创 2019-02-19 11:25:15 · 4054 阅读 · 4 评论 -
顶点缓存对象(VBO)和顶点数组对象(VAO)以及顶点数组(VA)的关系
在区分VBO以及VAO之前,我们先来了解其他的几个概念:glvertex,glCallList(显示列表),VA(顶点数组)。一、glvertexglvertex是最原始的设置顶点的方式,在glBegin和glEnd之间使用,每设置一次,就要和GPU通信一次,效率比较低。二、glCallList(显示列表)因为之前的glvertex每设置一次都要和GPU通信一次,效率比较低,现在的...原创 2019-02-14 14:57:54 · 1570 阅读 · 1 评论 -
使用Xcode查看当前渲染性能以及渲染情况
点击顶部Xcode导航栏 中的Debug ->View Debuging ->RenderingColor Blended Layers这个选项选项基于渲染程度对屏幕中的混合区域进行绿到红的高亮显示,越红表示性能越差,会对帧率等指标造成较大的影响。红色通常是由于多个半透明图层叠加引起。Color Hits Green and Misses Red当 UIView...转载 2019-03-04 17:00:34 · 2844 阅读 · 0 评论 -
Windows创建窗口涉及的概念以及相关函数
一、窗口结构体WNCLASS这个结构体存储的是一些关于窗口类信息的结构,成员如下:typedef struct tagWNDCLASSA { UINT style;//窗口类型 WNDPROC lpfnWndProc;//窗口处理函数(回调函数) int cbClsExtra;//窗口扩展(一般为0) int cbWndExtra...原创 2019-04-10 11:44:21 · 2089 阅读 · 0 评论 -
OpenGL中的着色器(GLSL)
OpenGL中的着色器(Shader)语言,也就是GLSL。可以把它们看作是一个独立的小程序,这个小程序有输入,然后处理输入,然后将处理的结果输出,两个Shader通过输入和输出进行通信,GLSL为此还有专门的关键字:in和 out 。shader发送方将输出规定为特定的类型,shader的接收方接收相同的类型作为自己的输入,这样两个shader就联系了起来。shader的格式基本固定,首先声...原创 2019-04-18 10:17:59 · 1603 阅读 · 1 评论 -
AR之虚拟人物的后处理导致真实场景的曝光过高解决方案
问题描述:最近在开发AR相关的设计,但是拍的AR照片背景一直是有过曝情况的,像下面这样:但是真实场景,应该是下面这样:可以看见,画面已经曝光到影响画质了。环境:使用的ARSDK:Vuforia,(但是这里的问题和使用的是什么SDK没有关系的,因为之前还使用过VoidAR,一个国产的SDK还是这个问题)平台:iOS,问题其实和平台也没有什么关系,因为我们需要改动...原创 2019-04-29 21:17:57 · 1095 阅读 · 0 评论 -
OpenGL之顶点着色器、片段着色器
本片文章的最终成果是在屏幕上画出一个三角形。涉及的知识主要有:顶点输入,顶点着色器,编译着色器,片段着色器,着色器程序,链接顶点属性,顶点数组对象,索引缓冲对象。首先我们来简答介绍一下OpenGL的渲染管线:1、渲染管线的第一部分是顶点着色器,顶点着色器允许我们设置一些简单的顶点属性,顶点着色器将一个顶点作为单独的输入,将顶点进行一些坐标系的变换(局部坐标系,世界坐标系,观察坐标系等)...原创 2019-08-04 17:53:47 · 1680 阅读 · 0 评论 -
在屏幕绘制一个三角形(使用顶点缓存)
首先头文件d3dUtility.h里面:Init3D函数:里面实现了Direct3D初始化的整个过程:包括获取接口Direct3D9的指针,检验设备的顶点运算,填充设备属性结构体的内容,创建IDirect3DDevice9的接口等。EnterMsgLoop函数:该函数接受了一个显示函数的函数指针,然后将应用程序的消息循环进行封装,穿进去的显示函数就是进行绘制的函数,然后EnterMsgLo...原创 2018-11-19 22:32:53 · 858 阅读 · 0 评论 -
D3DX几何体
在代码里面通过创建三角单元来构建3D模型都是非常频繁的,那么D3DX库里面也提供了一下生成简单3D模型的接口。D3DX提供了下面6个接口:D3DXCreateBoxD3DXCreateSphereD3DXCreateCylinderD3DXCreateTeapotD3DXCreatePolygonD3DXCreateTorus以上的接口非常相似,而且都使用了D3DX的网格...原创 2018-11-19 19:40:19 · 377 阅读 · 0 评论 -
Director3D中的绘制——顶点缓存和索引缓存
一个顶点缓存是储存有顶点数据的连续空间,一个索引缓存是储存有索引数据的连续空间,使用顶点缓存和索引缓存来表示相关的数据,而不使用数组来表示的原因是因为:顶点缓存和索引缓存储存在显存中,在处理的时候能够获得比系统内存更快的处理速度。在代码中,顶点缓存使用的接口IDirectorVertexBuffer9表示,索引缓存使用的是IDirectorIndexBuffer9表示。创建顶点缓存和索引缓...原创 2018-11-19 17:31:56 · 713 阅读 · 0 评论 -
游戏开发中必备的数学知识(一)——向量
3D空间中的向量向量:只有长度和方向,不含有位置信息的量,也就是说,两个向量只要长度和方向相同,则二者相同。左手坐标系和右手坐标系同样是三维的坐标系,两者的差别在Z轴上面。在左手坐标系中,Z轴正向穿入纸面;右手坐标系中,Z轴正向穿出纸面当某一向量的其起始坐标和坐标系的原点重合的时候,我们称该向量处于标准位置。用来描述向量坐标的,称之为分量。当某一个向量的起始位置在坐标系...原创 2018-11-09 22:29:58 · 1857 阅读 · 0 评论 -
游戏开发中必备的数学知识(二)——矩阵
一个m×n的矩阵是一个m行、n列的矩形数组,行数和列数指定了矩阵的维数,使用行和列组成双下标来标识矩阵的维数。通常用大写的字母表示矩阵。一下是一个3×3的矩阵:M,和一个2×4的矩阵:N有时候一个矩阵只包含一行或者一列,我们将这种矩阵称之为行向量或者列向量。矩阵相等两个矩阵维数相等且对应的元素也相等,这两个矩阵相等矩阵数乘矩阵可以和标量进行数乘,规则就是将标量个每一个矩...原创 2018-11-12 22:41:45 · 1567 阅读 · 0 评论 -
游戏开发中必备的数学知识(三)——矩阵的基本变换
基本变换使用Direct3D编程的时候,我们使用4×4的矩阵表示一个变换。其思路如下:设置一个4×4的矩阵中元素的值,使其表示某一个具体变换,然后我们将某一点的坐标或者某向量的分量放入一个1×4的行向量v中,乘积vX就是成为了一个新的经过变换的向量v。此时,我们之所以使用4×4的矩阵,,是因为这种特定维数的矩阵有能力表示我们所需要的所有变换,3×3的矩阵似乎更适合3D变化,但是例如:平移...原创 2018-11-13 23:40:40 · 1783 阅读 · 0 评论 -
D3DX库中表示4×4的矩阵的类:D3DXMATRIX
编写Director3D应用程序时,我们通常只使用4×4的矩阵以及1×4的行向量。注意:使用这两种维数的矩阵,意味着一下的乘法是有意义的:1、向量——矩阵乘法,若v是1×4的行向量,T为4×4的矩阵,则乘积vT是有意义的,是1×4的行向量2、矩阵——矩阵乘法,若T和R都是4×4的矩阵,则乘机就是4×4的矩阵,乘积TR和RT都有意义,但是TR和RT不一定相等在D3DX中可以使用D3D...原创 2018-11-13 21:58:52 · 1092 阅读 · 0 评论 -
Direct3D基础——预备知识:多重采样、像素格式、内存池、交换链和页面置换、深度缓存、顶点运算、设备性能
多重采样用像素矩阵表示图像的时候往往会出现块状效应,多重采样便是一项用于平滑块状图像的技术。图片来自:DirectX9.03D游戏开发编程基础左边那条是一条锯齿线,右边是一条经过采样的反走样线,看上去要平滑的多。D3DMULTISAMPLE_TYPE枚举类型包含了一系列枚举常量值,用于表示对表面进行多重采样的级别:1、D3DMULTISAMPLE_NONE:禁止多重采样...原创 2018-11-15 16:54:49 · 1068 阅读 · 0 评论 -
Direct3D基础——Direct3D的初始化
首先概述一下Direct初始化的大概步骤(稍后我们会详细说明):1、获取接口IDirect3D9 的指针。该接口用于获取系统物理硬件设备的信息并创建接口:IDirect3DDevice9,接口可以看是一个C++对象,代表了我们用来显示3D图形的硬件物理设备。2、检查设备的性能(D3DCAPS9),判断显卡是否支持硬件顶点的计算,是因为我们必须明确显卡是否支持该功能,才能创建IDirect3...原创 2018-11-15 22:55:10 · 938 阅读 · 0 评论 -
Direct3D基础——Direct3D概述
概述Direct3D是一套底层图形API,借助该API我们可以利用硬件加速功能来实现3D场景的绘制,Direct3D可以视为应用程序和底层设备的交互。下图展示了Direct3D和硬件之间的交互关系:图中Direct3D部分是一套已经定义好的,由Direct3D提供给应用程序和开发人员的接口函数,这些接口代表了当前Direct3D支持的所有功能。注意:有些功能Direct3D支持,但...原创 2018-11-14 22:32:00 · 4132 阅读 · 2 评论 -
Direct3D基础——预备知识:表面
表面我们可以将其看作是Direct3D主要用于储存2D图像数据的一个像素矩阵。虽然我们将表面看作矩阵,但是其实际的存储是在一个线性数组里面。表面的宽度(Width)和高度(Height)都是用像素来表示,跨度(Pitch)则用字节来度量,更具体的说:跨度(Pitch)可能比宽度(Width)更宽,这要依赖于底层的硬件实现,所以不能简单的假设pitch = Width×Height。在代...原创 2018-11-14 23:39:21 · 427 阅读 · 0 评论 -
在屏幕绘制一个旋转的线框立方体(使用顶点缓存和索引缓存)
首先里面还是有两个基本的文件:d3dUtility.h以及d3dUtility.cpp里面的主要内容就是实现Direct3D的初始化,以及模板函数的的实现,和消息循环函数的声明,回调函数的声明。具体的解释在博客:在屏幕绘制一个三角形以及Direct3D初始化例程中有详细的解释,这里就不在过多的重复。我们主要来看主函数文件Cube.cpp里面是怎么实现,我们在代码中详细的讲解,下面是cu...原创 2018-11-20 14:57:33 · 614 阅读 · 0 评论 -
Direct3D初始化例程
看过Direct3D初始化之后,我们来总体的串一下,搞出个示例,方便学习。我们现在要做的就是实现Direct3D的初始化,并将背景设置为红色。在下面的例子中,我们使用了d3dUtility.h/cpp,这两个文件中就是实现每一个Direct3D应用程序都要干的事情,例如创建窗口、初初始化Direct3D、进入应用程序消息循环等,现在我们将这些共性的任务封装在一起。开始例子之前,我们先来...原创 2018-11-16 16:43:37 · 499 阅读 · 0 评论 -
绘制流水线——模型表示:顶点格式、三角单元、索引
场景是物体挥着模型的集合,任何的物体我们都可以使用三角网格来逼近的表示,三角网格是构成物体的模型的基本单元。我们通常使用下面的术语来描述网格中的三角形:多边形、图元、网格几何元。一个多边形中相邻两边的交汇点称之为顶点,描述三角形单元的时候,我们需要指定三角单元的顶点,描述物体的时候,我们应该指定三角单元的列表。顶点格式刚才对于顶点的描述是几何学的,但是在Direct3D中,刚才的描述可...原创 2018-11-16 20:42:15 · 588 阅读 · 0 评论 -
绘制流水线——虚拟摄影机
摄影机指定了场景对于观察者的可见部分,也就是我们依据那一部分的3D场景来绘制我们的2D图像,在坐标系中,摄影机是有位置以及方向的,定义了可见空间体积。下图展示了一个虚拟的摄影机模型: 上述的空间体积是一个视域体,采用视域体的主要原因是因为显示屏为矩形,位于视域体之外的矩形是不可见的,在进一步处理的时候,就应该丢弃掉,我们把丢弃掉的这个过程称之为裁剪。投影窗口是一个2D区域,位于视域体中...原创 2018-11-16 20:59:51 · 288 阅读 · 0 评论 -
DX9的绘制流水线
一旦我们建立了3D场景的几何描述,确定好虚拟摄影机,接下来的任务就是在显示器中建立3D场景的2D表示,为了实现这一个过后才能,我们专门的流程来完成它,我们称之为绘制流水线。大致如下图:(从左至右)在绘制流水线中,有几个比较重要的部分就是,是坐标系的变换,这类坐标的变换通常是使用矩阵来实现的,Direct3D可以帮助我们实现这些变换,我们所提供的仅仅只是提供需要变换的矩阵以及变换的类型,,Dir...原创 2018-11-16 22:49:56 · 720 阅读 · 0 评论 -
Direct3D基础——颜色
颜色表示在Direct3D中颜色使用RGB来表示,我们认为颜色都可以分成:Red(红色)、Green(绿色)、Blue(蓝色)这三种颜色的加性混合,跟向量一样。RGB数据可以使用两种不同的结构来保存。第一种是:D3DCOLOR,这个结构和DWORD完全相同,由typdef进行定义,一共4个字节,32位,D3DCOLOR类型中的各个分量被分成四个8位置的数据,分别来储存RGB三个颜色和一...原创 2018-11-21 14:37:58 · 930 阅读 · 0 评论 -
在屏幕绘制两个三角形(平面着色模式和Gouraud着色模式)
该例程有三个文件:d3dUtility.cpp,colorTriangle.cpp,d3dUtility.h关于d3dUtility.cpp以及d3dUtility.h两个文件里面内容在博客:Direct3D初始化例程中有详细的解释以及拿来就能用的源代码但是在初始化以及绘制普通的三角形的例子中我们没有涉及到颜色,现在我们使用颜色,就需要在.h文件中定义一些全局的颜色,供图元中的顶点使用。...原创 2018-11-21 15:49:51 · 1102 阅读 · 0 评论 -
Direct3D基础——光照的组成、材质、顶点法线、光源
为了增强所绘制的场景的真实感,我们会为场景增加光照,使用光照来描物体的立体感。使用光照的时候,我们就无需描述顶点的颜色,Direct3D会将顶点送入光照计算引擎,然后引擎根据光源类型,材质以及物体表面和相对于光源的朝向等等,计算出内个顶点的颜色值。基于某种光照模型然后计算出顶点的颜色,效果更nice。光照的组成环境光这种类型的光经过其他物体表面反射到达所观察物体,并且照亮场景。比如:某...原创 2018-11-22 11:00:59 · 1053 阅读 · 0 评论 -
D3DX库中表示3D空间向量的类:D3DXVECTOR3
D3DVECTOR:注意:里面只定义了单个变量,代表x,y,z的坐标。typedef struct D3DVECTOR { float x, y, z;}D3DVECTOR;D3DXVECTOR3:注意:D3DXVECTOR继承了D3DVECTOR里面的三个元素typedef struct D3DXVECTOR3 : public D3DVECTOR{public:...原创 2018-11-09 21:37:38 · 1646 阅读 · 2 评论