您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 【Visual-C++】游戏开发笔记全集
【VisualC++】游戏开发笔记三十DirectX112D纹理映射知识全攻略【VisualC++】游戏开发笔记二十九一步一步教你用优雅的Direct3D11代码画一个三角形【VisualC++】游戏开发笔记二十八最精简的Direct3D11Demo筋骨脉络全攻略【VisualC++】游戏开发笔记二十七Direct3D11入门级知识介绍【VisualC++】游戏开发笔记二十六DirectX11各组件的介绍&第一个DirectX11Demo的创建【VisualC++】游戏开发笔记二十五最简化的DirectX11开发环境的配【VisualC++】游戏开发笔记二十四由DirectX的几个版本说【VisualC++】游戏开发笔记二十三游戏基础物理建模(五)粒子系统模拟(二)【VisualC++】游戏开发笔记二十二游戏基础物理建模(四)粒子系统模拟(一)【VisualC++】游戏开发笔记二十一游戏基础物理建模(三)摩擦力系统模拟【VisualC++】游戏开发笔记二十游戏基础物理建模(二)重力系统的模拟【VisualC++】游戏开发笔记十八游戏基础物理建模(一)匀速与加速运动。【VisualC++】游戏开发笔记十九DirectX与OpenGL的博弈【VisualC++】游戏开发笔记十七游戏基础算法(一)游戏随机系统初步【VisualC++】游戏开发笔记十八游戏基础物理建模(一)匀速与加速运动。【VisualC++】游戏开发笔记十六讲解一个完整的回合制游戏demo【VisualC++】游戏开发笔记十五游戏人工智能(一)运动型游戏AI【VisualC++】游戏开发笔记十二游戏输入消息处理(一)键盘消息处理【VisualC++】游戏开发笔记十四游戏画面绘图(四)华丽的CImage类【VisualC++】游戏开发笔记十三游戏输入消息处理(二)鼠标消息处理【VisualC++】游戏开发笔记十二游戏输入消息处理(一)键盘消息处理【VisualC++】游戏开发笔记之十一基础动画显示(四)排序贴图【VisualC++】游戏开发笔记之十基础动画显示(三)透明动画的实现【VisualC++】游戏开发笔记之九游戏地图制作(一)平面地图贴图【VisualC++】游戏开发笔记之八——基础动画显示(二)游戏循环的使用【VisualC++】游戏开发笔记之七——基础动画显示(一)定时器的使用【VisualC++】游戏开发笔记之六——游戏画面绘图(三)透明特效的制作方法【VisualC++】游戏开发笔记之四——游戏画面绘图(一)基本图形绘制【VisualC++】游戏开发笔记之五——游戏画面绘图(二)绘制位图【VisualC++】游戏开发笔记之一——API函数、DirectX的关键系【VisualC++】游戏开发笔记之二——最简单的DirectX,vc窗口的编写【VisualC++】游戏开发笔记之三——绘制图元【VisualC++】游戏开发笔记三十DirectX112D纹理映射知识全攻略本系列文章由zhmxy555(毛星云)编写,转载请注明出处。作者:毛星云邮箱:happylifemxy@qq.com本节知识先是对DirectX11关于2D纹理映射方面基础知识的一个讲解,然后通过一个demo的创建过程来将学到的理论知识付诸实践。一、引言在之前我们提到过,纹理实际上就是映射到物体表面的数据。其实,纹理也可能是其他的一些信息片段,比如用于映射的常规映射值,用于控制透明度的alpha值,等等。通常情况下,纹理是通过一个叫做纹理映射的过程来映射一幅图像到表面上的颜色值,这种功能能显著地增加所绘制场景的细腻感和真实感。纹理和游戏开发中需要的其他数据一样,通常都是在运行时加载的。由于纹理是Direct3D重要的组成的部分,微软为我们提供了众多功能强大而丰富的Direct3D内建的函数,来处理纹理相关的操作。二、基础知识讲解1.纹理的加载在Direct3D11中,我们通常使用D3DX11CreateTextureFromFile函数用于从硬盘文件中加载纹理。这个函数支持非常丰富的图像格式,比如BMP,PNG,以及DDS。D3DX11CreateTextureFromFile函数拥有六个变量,具有以下的函数原型:[cpp]viewplaincopyprint?1.HRESULTD3DX11CreateTextureFromFile(2.3.ID3D11Device*pDevice,4.5.LPCTSTRpSrcFile,6.7.D3DX11_IMAGE_LOAD_INFO*pLoadInfo,8.9.ID3DX11ThreadPump*pPump,10.11.ID3D11Resource**ppTexture,12.13.HRESULT*pHResult14.15.);D3DX11CreateTextureFromFile函数的第一个的参数为ID3D11Device类型的指针变量。第二个参数pSrcFile为被加载文件的文件路径和文件名。第三个参数pLoadInfo为一个图形信息结构体。它为一个可选的参数,并允许我们通过指定CPU访问的标识、内部格式、宽度和高度来控制图像纹理的加载方式。第四个参数pPump用于多线程加载纹理时的异步处理。第五个参数ppTexture用是纹理对象被调用时这个函数创建出的地址。如果D3DX11CreateTextureFromFile函数调用成功,这个变量就会拥有一个现成的纹理供使用。最后一个参数pHResult是指向线程返回值的指针。若此线程的参数不为空,pHResult必须为一个有效的内存地址。在Direct3D中我们能够使用很多函数载入各种琳琅满目的图像文件格式,下面我们对他们进行一个详细的列举:WindowsBitmap(BMP)JointPhotographicExpertGroup—i.e.,JPEG(JPG)PortableNetworkGraphics(PNG)TaggedImageFormat(TIFF)GraphicsInterchangeFormat(GIF)DirectDrawSurface(DDS)WindowsMediaPlayer(WMP)2.纹理接口纹理接口通常用于管理一个特定类型的图像数据。目前Direct3D纹理接口主要有三种类型,他们分别是:ID3D11Texture1D——用于1D或者条形的纹理ID3D11Texture2D——用于2D数据,这也是最常用的纹理资源类型、ID3D11Texture3D——用于表示3D数据的纹理资源类型上述3种纹理资源类型都包含一个或者多个子资源。而游戏开发中使用的大多数纹理类型基本上都为二维的,他们都需要转化为ID3D11Texture2D型资源后再使用。而这些子资源代表了纹理中不同的MIP等级。譬如Adobe’sPhotoshop这类的图像编辑器是创造2D纹理的最得力帮手。3.纹理细节在游戏开发的过程中,常常我们需要从加载的纹理中得到一些特定的信息,比如说维度或者像素格式。这时候隶属于ID3D11Texture2D中的GetDesc函数就可以派上用场了。这个函数的功能是为我们填充D3D11_TEXTURE2D_DESC结构体中的各种细节,从而通过这个结构体作为载体,有关的各类数据就一目了然了。D3D11_TEXTURE2D_DESC是专用于2D纹理的纹理描述结构体家族中的一员。对于其他的两个维度,Direct3D11为我们准备了D3D11_TEXTURE1D_DESC用于1D纹理,D3D11_TEXTURE3D_DESC用于3D纹理。作为最常见的纹理,二维的D3D11_TEXTURE2D_DESC声明形式如下:[cpp]viewplaincopyprint?1.typedefstructD3D11_TEXTURE2D_DESC{2.3.UINTWidth;4.5.UINTHeight;6.7.UINTMipLevels;8.9.UINTArraySize;10.11.DXGI_FORMATFormat;12.13.DXGI_SAMPLE_DESCSampleDesc;14.15.D3D11_USAGEUsage;16.17.UINTBindFlags;18.19.UINTCPUAccessFlags;20.21.UINTMiscFlags;22.23.}D3D11_TEXTURE2D_DESC;三、DirectX112D纹理映射demo的创建这里,我们先介绍一下这个demo的组成结构:如图,头文件有Dx11DemoBase.h以及Texture2DDemo.h源文件有Dx11DemoBase.cpp,Texture2DDemo.h以及main.cpp在之前的TriangleDemo的基础上,我们再添加一个叫做TextureDemo的类,以及添加一个叫做colorMap_的D3D11ShaderResourceView类型的着色器资源视图和一个D3D11SamplerState类型的唤做colorMapSampler_的采样状态。着色资源视图简单的来说是一个用于访问资源的对象。当我们加载纹理到内存中的时候,必须创建一个着色器资源视图来通过着色器获取数据,而这些数据会被绑定到输出程序集当中。着色器资源视图也有其他的作用,比如为DirectCompute提供异步运算时需要的数据,本节我们主要是介绍其在纹理方面的运用。ID3D11Texture2D代表数据的缓存,而着色器资源视图允许我们在着色器中查看这个缓存的各项数据。采样器声明(samplerstate)允许我们访问的纹理采样的状态信息。后面将对其做更多更详细的讲解。TextureDemo类的头文件代码书写风格如下:代码段一TextureDemo.h对TextureDemo类的轮廓书写[cpp]viewplaincopyprint?1.#ifndef_TEXTURE_2D_DEMO_H_2.#define_TEXTURE_2D_DEMO_H_3.4.#includeDx11DemoBase.h5.6.7.classTextureDemo:publicDx11DemoBase8.{9.public:10.TextureDemo();11.virtual~TextureDemo();12.13.boolLoadContent();14.voidUnloadContent();15.16.voidUpdate(floatdt);17.voidRender();18.19.private:20.ID3D11VertexShader*solidColorVS_;21.ID3D11PixelShader*solidColorPS_;22.23.ID3D11InputLayout*inputLayout_;24.ID3D11Buffer*vertexBuffer_;25.26.ID3D11ShaderResourceView*colorMap_;27.ID3D11SamplerState*colorMapSampler_;28.};29.30.#endif由于我们正在执行纹理映射这项操作,我们需要对顶点结构体的代码进行更新,使其包含两个浮点型的变量。这项工作可由XMFLOAT2结构体来完成。代码段二中展示了这个demo中顶点结构体,LoadContent,函数和UnloadContent函数的写法代码段二顶点结构体以及LoadContent和UnloadContent的书写[cpp]viewplaincopyprint?1.structVertexPos2.3.{4.5.XMFLOAT3pos;6.7.XMFLOAT2tex0;8.9.};10.11.boolTextureDemo::LoadContent()12.13.{14.15....LoadvertexShader...16.17.D3D11_INPUT_ELEMENT_D
本文标题:【Visual-C++】游戏开发笔记全集
链接地址:https://www.777doc.com/doc-4962327 .html