【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略

上传人:mg****85 文档编号:34159989 上传时间:2018-02-21 格式:DOC 页数:35 大小:422KB
返回 下载 相关 举报
【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略_第1页
第1页 / 共35页
【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略_第2页
第2页 / 共35页
【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略_第3页
第3页 / 共35页
【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略_第4页
第4页 / 共35页
【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略》由会员分享,可在线阅读,更多相关《【visual c++】游戏开发笔记 directx11 2d纹理映射知识全攻略(35页珍藏版)》请在金锄头文库上搜索。

1、 【Visual C+】游戏开发笔记三十 DirectX11 2D 纹理映射知识全攻略本系列文章由 zhmxy555(毛星云)编写,转载请注明出处。http:/ 邮箱: 本节知识先是对 DirectX11 关于 2D 纹理映射方面基础知识的一个讲解,然后通过一个 demo 的创建过程来将学到的理论知识付诸实践。一、引言在之前我们提到过,纹理实际上就是映射到物体表面的数据。其实,纹理也可能是其他的一些信息片段,比如用于映射的常规映射值,用于控制透明度的 alpha 值,等等。通常情况下,纹理是通过一个叫做纹理映射的过程来映射一幅图像到表面上的颜色值,这种功能能显著地增加所绘制场景的细腻感和真实

2、感。纹理和游戏开发中需要的其他数据一样,通常都是在运行时加载的。由于纹理是 Direct3D 重要的组成的部分,微软为我们提供了众多功能强大而丰富的 Direct3D 内建的函数,来处理纹理相关的操作。二、基础知识讲解1.纹理的加载在 Direct3D11 中,我们通常使用 D3DX11CreateTextureFromFile 函数用于从硬盘文件中加载纹理。这个函数支持非常丰富的图像格式,比如 BMP,PNG,以及 DDS。D3DX11CreateTextureFromFile 函数拥有六个变量,具有以下的函数原型:cpp view plaincopyprint?1. HRESULT D3D

3、X11CreateTextureFromFile( 2. 3. ID3D11Device* pDevice, 4. 5. LPCTSTR pSrcFile, 6. 7. D3DX11_IMAGE_LOAD_INFO* pLoadInfo, 8. 9. ID3DX11ThreadPump* pPump, 10. 11. ID3D11Resource* ppTexture, 12. 13. HRESULT* pHResult 14. 15. ); D3DX11CreateTextureFromFile 函数的第一个的参数为 ID3D11Device 类型的指针变量。第二个参数 pSrcFile 为

4、被加载文件的文件路径和文件名。第三个参数 pLoadInfo 为一个图形信息结构体。它为一个可选的参数,并允许我们通过指定 CPU 访问的标识、内部格式、宽度和高度来控制图像纹理的加载方式。第四个参数 pPump 用于多线程加载纹理时的异步处理。第五个参数 ppTexture 用是纹理对象被调用时这个函数创建出的地址。如果 D3DX11CreateTextureFromFile函数调用成功,这个变量就会拥有一个现成的纹理供使用。最后一个参数 pHResult 是指向线程返回值的指针。若此线程的参数不为空,pHResult 必须为一个有效的内存地址。在 Direct3D 中我们能够使用很多函数载

5、入各种琳琅满目的图像文件格式,下面我们对他们进行一个详细的列举:Windows Bitmap (BMP)Joint Photographic Expert Groupi.e., JPEG (JPG)Portable Network Graphics (PNG)Tagged Image Format (TIFF)Graphics Interchange Format (GIF)DirectDraw Surface (DDS)Windows Media Player (WMP)2.纹理接口纹理接口通常用于管理一个特定类型的图像数据。目前 Direct3D 纹理接口主要有三种类型,他们分别是:ID3

6、D11Texture1D用于 1D 或者条形的纹理ID3D11Texture2D用于 2D 数据,这也是最常用的纹理资源类型、ID3D11Texture3D用于表示 3D 数据的纹理资源类型上述 3 种纹理资源类型都包含一个或者多个子资源。而游戏开发中使用的大多数纹理类型基本上都为二维的,他们都需要转化为 ID3D11Texture2D 型资源后再使用。而这些子资源代表了纹理中不同的 MIP 等级。譬如 Adobes Photoshop 这类的图像编辑器是创造 2D 纹理的最得力帮手。3. 纹理细节在游戏开发的过程中,常常我们需要从加载的纹理中得到一些特定的信息,比如说维度或者像素格式。这时候

7、隶属于 ID3D11Texture2D 中的 GetDesc 函数就可以派上用场了。这个函数的功能是为我们填充D3D11_TEXTURE2D_DESC 结构体中的各种细节,从而通过这个结构体作为载体,有关的各类数据就一目了然了。D3D11_TEXTURE2D_DESC 是专用于 2D 纹理的纹理描述结构体家族中的一员。对于其他的两个维度,Direct3D11 为我们准备了 D3D11_TEXTURE1D_DESC 用于 1D 纹理,D3D11_TEXTURE3D_DESC 用于 3D 纹理。作为最常见的纹理,二维的 D3D11_TEXTURE2D_DESC 声明形式如下:cpp view pl

8、aincopyprint?1. typedef struct D3D11_TEXTURE2D_DESC 2. 3. UINT Width; 4. 5. UINT Height; 6. 7. UINT MipLevels; 8. 9. UINT ArraySize; 10. 11. DXGI_FORMAT Format; 12. 13. DXGI_SAMPLE_DESC SampleDesc; 14. 15. D3D11_USAGE Usage; 16. 17. UINT BindFlags; 18. 19. UINT CPUAccessFlags; 20. 21. UINT MiscFlags

9、; 22. 23. D3D11_TEXTURE2D_DESC; 三、DirectX11 2D 纹理映射 demo 的创建 这里,我们先介绍一下这个 demo 的组成结构:如图,头文件有 Dx11DemoBase.h 以及 Texture2DDemo.h源文件有 Dx11DemoBase.cpp,Texture2DDemo.h 以及 main.cpp在之前的 TriangleDemo 的基础上,我们再添加一个叫做 TextureDemo 的类,以及添加一个叫做 colorMap_的 D3D11ShaderResourceView 类型的着色器资源视图和一个 D3D11SamplerState 类

10、型的唤做colorMapSampler_ 的采样状态。着色资源视图简单的来说是一个用于访问资源的对象。当我们加载纹理到内存中的时候,必须创建一个着色器资源视图来通过着色器获取数据,而这些数据会被绑定到输出程序集当中。着色器资源视图也有其他的作用,比如为 DirectCompute 提供异步运算时需要的数据,本节我们主要是介绍其在纹理方面的运用。ID3D11Texture2D 代表数据的缓存,而着色器资源视图允许我们在着色器中查看这个缓存的各项数据。采样器声明(sampler state)允许我们访问的纹理采样的状态信息。后面将对其做更多更详细的讲解。TextureDemo 类的头文件代码书写风

11、格如下:代码段一 TextureDemo.h 对 TextureDemo 类的轮廓书写cpp view plaincopyprint?1. #ifndef _TEXTURE_2D_DEMO_H_ 2. #define _TEXTURE_2D_DEMO_H_ 3. 4. #includeDx11DemoBase.h 5. 6. 7. class TextureDemo : public Dx11DemoBase 8. 9. public: 10. TextureDemo( ); 11. virtual TextureDemo( ); 12. 13. bool LoadContent( ); 14

12、. void UnloadContent( ); 15. 16. void Update( float dt ); 17. void Render( ); 18. 19. private: 20. ID3D11VertexShader* solidColorVS_; 21. ID3D11PixelShader* solidColorPS_; 22. 23. ID3D11InputLayout* inputLayout_; 24. ID3D11Buffer* vertexBuffer_; 25. 26. ID3D11ShaderResourceView* colorMap_; 27. ID3D1

13、1SamplerState* colorMapSampler_; 28. ; 29. 30. #endif 由于我们正在执行纹理映射这项操作,我们需要对顶点结构体的代码进行更新,使其包含两个浮点型的变量。这项工作可由 XMFLOAT2 结构体来完成。代码段二中展示了这个 demo 中顶点结构体, LoadContent,函数和 UnloadContent 函数的写法代码段二 顶点结构体以及 LoadContent 和 UnloadContent 的书写cpp view plaincopyprint?1. struct VertexPos 2. 3. 4. 5. XMFLOAT3 pos; 6.

14、 7. XMFLOAT2 tex0; 8. 9. ; 10. 11. bool TextureDemo:LoadContent( ) 12. 13. 14. 15. . Load vertex Shader . 16. 17. D3D11_INPUT_ELEMENT_DESC solidColorLayout = 18. 19. 20. 21. POSITION, 0, DXGI_FORMAT_R32G32B32_FLOAT, 22. 23. 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 , 24. 25. TEXCOORD, 0, DXGI_FORMAT_R32G

15、32_FLOAT, 26. 27. 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 28. 29. ; 30. 31. unsigned int totalLayoutElements = ARRAYSIZE( solidColorLayout ); 32. 33. d3dResult = d3dDevice_-CreateInputLayout( solidColorLayout, 34. 35. totalLayoutElements, vsBuffer-GetBufferPointer( ), 36. 37. vsBuffer-GetBufferSize( ), 38. 39. . Load Pixel Shader . 40. 41. VertexPos vertices = 42

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号