ImageVerifierCode 换一换
格式:DOCX , 页数:58 ,大小:171.81KB ,
资源ID:9215675      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9215675.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC++游戏开发随记之三十.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC++游戏开发随记之三十.docx

1、VC+游戏开发随记之三十【Visual C+】游戏开发笔记三十 DirectX11 2D纹理映射知识全攻略本节知识先是对DirectX11关于2D纹理映射方面基础知识的一个讲解,然后通过一个demo的创建过程来将学到的理论知识付诸实践。一、引言在之前我们提到过,纹理实际上就是映射到物体表面的数据。其实,纹理也可能是其他的一些信息片段,比如用于映射的常规映射值,用于控制透明度的alpha值,等等。通常情况下,纹理是通过一个叫做纹理映射的过程来映射一幅图像到表面上的颜色值,这种功能能显著地增加所绘制场景的细腻感和真实感。纹理和游戏开发中需要的其他数据一样,通常都是在运行时加载的。由于纹理是Dire

2、ct3D重要的组成的部分,微软为我们提供了众多功能强大而丰富的Direct3D内建的函数,来处理纹理相关的操作。二、基础知识讲解1.纹理的加载在Direct3D11中,我们通常使用D3DX11CreateTextureFromFile函数用于从硬盘文件中加载纹理。这个函数支持非常丰富的图像格式,比如BMP,PNG,以及DDS。D3DX11CreateTextureFromFile函数拥有六个变量,具有以下的函数原型:cppview plaincopyprint?1. HRESULTD3DX11CreateTextureFromFile(2. 3. ID3D11Device*pDevice,4.

3、 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访问的标识、内部格式、

4、宽度和高度来控制图像纹理的加载方式。第四个参数pPump用于多线程加载纹理时的异步处理。第五个参数ppTexture用是纹理对象被调用时这个函数创建出的地址。如果D3DX11CreateTextureFromFile函数调用成功,这个变量就会拥有一个现成的纹理供使用。最后一个参数pHResult是指向线程返回值的指针。若此线程的参数不为空,pHResult必须为一个有效的内存地址。在Direct3D中我们能够使用很多函数载入各种琳琅满目的图像文件格式,下面我们对他们进行一个详细的列举:Windows Bitmap (BMP)Joint Photographic Expert Groupi.e.

5、, JPEG (JPG)Portable Network Graphics (PNG)Tagged Image Format (TIFF)Graphics Interchange Format (GIF)DirectDraw Surface (DDS)Windows Media Player (WMP)2.纹理接口纹理接口通常用于管理一个特定类型的图像数据。目前Direct3D纹理接口主要有三种类型,他们分别是:ID3D11Texture1D用于1D或者条形的纹理ID3D11Texture2D用于2D数据,这也是最常用的纹理资源类型、ID3D11Texture3D用于表示3D数据的纹理资源类型

6、上述3种纹理资源类型都包含一个或者多个子资源。而游戏开发中使用的大多数纹理类型基本上都为二维的,他们都需要转化为ID3D11Texture2D型资源后再使用。而这些子资源代表了纹理中不同的 MIP等级。譬如Adobes Photoshop这类的图像编辑器是创造2D纹理的最得力帮手。3. 纹理细节在游戏开发的过程中,常常我们需要从加载的纹理中得到一些特定的信息,比如说维度或者像素格式。这时候隶属于ID3D11Texture2D中的GetDesc函数就可以派上用场了。这个函数的功能是为我们填充D3D11_TEXTURE2D_DESC结构体中的各种细节,从而通过这个结构体作为载体,有关的各类数据就一

7、目了然了。D3D11_TEXTURE2D_DESC是专用于2D纹理的纹理描述结构体家族中的一员。对于其他的两个维度,Direct3D11为我们准备了D3D11_TEXTURE1D_DESC用于1D纹理,D3D11_TEXTURE3D_DESC用于3D纹理。作为最常见的纹理,二维的D3D11_TEXTURE2D_DESC声明形式如下:cppview plaincopyprint?1. typedefstructD3D11_TEXTURE2D_DESC2. 3. UINTWidth;4. 5. UINTHeight;6. 7. UINTMipLevels;8. 9. UINTArraySize;1

8、0. 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;三、DirectX11 2D纹理映射demo的创建这里,我们先介绍一下这个demo的组成结构:如图,头文件有Dx11DemoBase.h以及Texture2DDemo.h源文件有 Dx11DemoBase.cpp,Texture2

9、DDemo.h以及main.cpp在之前的TriangleDemo的基础上,我们再添加一个叫做TextureDemo的类,以及添加一个叫做colorMap_的D3D11ShaderResourceView类型的着色器资源视图和一个D3D11SamplerState类型的唤做colorMapSampler_ 的采样状态。着色资源视图简单的来说是一个用于访问资源的对象。当我们加载纹理到内存中的时候,必须创建一个着色器资源视图来通过着色器获取数据,而这些数据会被绑定到输出程序集当中。着色器资源视图也有其他的作用,比如为DirectCompute提供异步运算时需要的数据,本节我们主要是介绍其在纹理方面

10、的运用。ID3D11Texture2D代表数据的缓存,而着色器资源视图允许我们在着色器中查看这个缓存的各项数据。采样器声明(sampler state)允许我们访问的纹理采样的状态信息。后面将对其做更多更详细的讲解。TextureDemo类的头文件代码书写风格如下:代码段一 TextureDemo.h 对TextureDemo类的轮廓书写cppview plaincopyprint?1. #ifndef_TEXTURE_2D_DEMO_H_2. #define_TEXTURE_2D_DEMO_H_3. 4. #includeDx11DemoBase.h5. 6. 7. classTexture

11、Demo:publicDx11DemoBase8. 9. public:10. TextureDemo();11. virtualTextureDemo();12. 13. boolLoadContent();14. voidUnloadContent();15. 16. voidUpdate(floatdt);17. voidRender();18. 19. private:20. ID3D11VertexShader*solidColorVS_;21. ID3D11PixelShader*solidColorPS_;22. 23. ID3D11InputLayout*inputLayout

12、_;24. ID3D11Buffer*vertexBuffer_;25. 26. ID3D11ShaderResourceView*colorMap_;27. ID3D11SamplerState*colorMapSampler_;28. ;29. 30. #endif由于我们正在执行纹理映射这项操作,我们需要对顶点结构体的代码进行更新,使其包含两个浮点型的变量。这项工作可由XMFLOAT2结构体来完成。代码段二中展示了这个demo中顶点结构体,LoadContent,函数和 UnloadContent函数的写法代码段二 顶点结构体以及 LoadContent和UnloadContent的书写

13、cppview plaincopyprint?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_DESCsolidColorLayout=18. 19. 20. 21. POSITION,0,DXGI_FORMAT_R32G32B32_FLOAT,22. 23. 0,0,D3D11_INPUT_PER_VERTEX

14、_DATA,0,24. 25. TEXCOORD,0,DXGI_FORMAT_R32G32_FLOAT,26. 27. 0,12,D3D11_INPUT_PER_VERTEX_DATA,028. 29. ;30. 31. unsignedinttotalLayoutElements=ARRAYSIZE(solidColorLayout);32. 33. d3dResult=d3dDevice_-CreateInputLayout(solidColorLayout,34. 35. totalLayoutElements,vsBuffer-GetBufferPointer(),36. 37. vs

15、Buffer-GetBufferSize(),&inputLayout_);38. 39. .LoadPixelShader.40. 41. VertexPosvertices=42. 43. 44. 45. XMFLOAT3(1.0f,1.0f,1.0f),XMFLOAT2(1.0f,1.0f),46. 47. XMFLOAT3(1.0f,-1.0f,1.0f),XMFLOAT2(1.0f,0.0f),48. 49. XMFLOAT3(-1.0f,-1.0f,1.0f),XMFLOAT2(0.0f,0.0f),50. 51. XMFLOAT3(-1.0f,-1.0f,1.0f),XMFLOA

16、T2(0.0f,0.0f),52. 53. XMFLOAT3(-1.0f,1.0f,1.0f),XMFLOAT2(0.0f,1.0f),54. 55. XMFLOAT3(1.0f,1.0f,1.0f),XMFLOAT2(1.0f,1.0f),56. 57. ;58. 59. .CreateVertexBuffer.60. 61. d3dResult=D3DX11CreateShaderResourceViewFromFile(d3dDevice_,62. 63. decal.dds,0,0,&colorMap_,0);64. 65. if(FAILED(d3dResult)66. 67. 68

17、. 69. DXTRACE_MSG(Failedtoloadthetextureimage!);70. 71. returnfalse;72. 73. 74. 75. D3D11_SAMPLER_DESCcolorMapDesc;76. 77. ZeroMemory(&colorMapDesc,sizeof(colorMapDesc);78. 79. colorMapDesc.AddressU=D3D11_TEXTURE_ADDRESS_WRAP;80. 81. colorMapDesc.AddressV=D3D11_TEXTURE_ADDRESS_WRAP;82. 83. colorMapD

18、esc.AddressW=D3D11_TEXTURE_ADDRESS_WRAP;84. 85. colorMapDesc.ComparisonFunc=D3D11_COMPARISON_NEVER;86. 87. colorMapDesc.Filter=D3D11_FILTER_MIN_MAG_MIP_LINEAR;88. 89. colorMapDesc.MaxLOD=D3D11_FLOAT32_MAX;90. 91. d3dResult=d3dDevice_-CreateSamplerState(&colorMapDesc,92. 93. &colorMapSampler_);94. 95

19、. if(FAILED(d3dResult)96. 97. 98. 99. DXTRACE_MSG(Failedtocreatecolormapsamplerstate!);100. 101. returnfalse;102. 103. 104. 105. returntrue;106. 107. 108. 109. voidTextureDemo:UnloadContent()110. 111. 112. 113. if(colorMapSampler_)colorMapSampler_-Release();114. 115. if(colorMap_)colorMap_-Release()

20、;116. 117. if(solidColorVS_)solidColorVS_-Release();118. 119. if(solidColorPS_)solidColorPS_-Release();120. 121. if(inputLayout_)inputLayout_-Release();122. 123. if(vertexBuffer_)vertexBuffer_-Release();124. 125. colorMapSampler_=0;126. 127. colorMap_=0;128. 129. solidColorVS_=0;130. 131. solidColor

21、PS_=0;132. 133. inputLayout_=0;134. 135. vertexBuffer_=0;136. 137. UnloadContent函数释放了新对象,而LoadContent函数进行了纹理图像的加载。我们可以使用Direct3D中的D3DX11CreateShaderResourceViewFromFile函数(这个函数名是不是略长啊,哈哈),来加载一个纹理然后在一个简单的调用之中创建着色器资源视图。这个函数在我们想毕其功于一役的时候,即希望加载一个纹理连着创建一个新的着色器资源视图一步到位的时候,非常的好用。D3DX11CreateShaderResourceVi

22、ewFromFile函数的变量和D3DX11CreateTextureFromFile函数的相似度很高,这员大将有以下原型:cppview plaincopyprint?1. HRESULTD3DX11CreateShaderResourceViewFromFile(2. 3. ID3D11Device*pDevice,4. 5. LPCTSTRpSrcFile,6. 7. D3DX11_IMAGE_LOAD_INFO*pLoadInfo,8. 9. ID3DX11ThreadPump*pPump,10. 11. ID3D11ShaderResourceView*ppShaderResourc

23、eView,12. 13. HRESULT*pHResult14. 15. );LoadContent函数代码的最后一段完成的功能是采样器声明(sampler state)的创建。为了创建一个采样器声明(sampler state)的对象,很容易就可以通过功能联想到函数名CreateSamplerState。这个函数以采样器描述作为其一个参数。 而采样器描述拥有以下的声明:cppview plaincopyprint?1. typedefstructD3D11_SAMPLER_DESC2. 3. D3D11_FILTERFilter;4. 5. D3D11_TEXTURE_ADDRESS_MO

24、DEAddressU;6. 7. D3D11_TEXTURE_ADDRESS_MODEAddressV;8. 9. D3D11_TEXTURE_ADDRESS_MODEAddressW;10. 11. FLOATMipLODBias;12. 13. UINTMaxAnisotropy;14. 15. D3D11_COMPARISON_FUNCComparisonFunc;16. 17. FLOATBorderColor4;18. 19. FLOATMinLOD;20. 21. FLOATMaxLOD;22. 23. D3D11_SAMPLER_DESC;为了渲染我们的几何纹理,我们必须添加纹理

25、资源以及设置采样器描述。这两项特殊的任务分别分配给PSSetShaderResources函数 以及 PSSetSamplers函数来完成,设置这些数据到像素着色器之中。PSSetShaderResources函数具有以下原型:cppview plaincopyprint?1. voidPSSetShaderResources(2. 3. UINTStartSlot,4. 5. UINTNumViews,6. 7. ID3D11ShaderResourceView*const*ppShaderResourceViews8. 9. 10. 11. );PSSetSamplers函数也以起始点St

26、artSlot以及采样数量NumViews作为其参数。我们在之前demo里面关于Render的代码随着这节里面对这两个函数的加入,我们就可以看到更加出色的效果了。目前需要做的就是就修改着色器的渲染效果了。Texture Mappingdemo类的Render函数如下代码段X代码段三TextureDemo类的render函数的书写cppview plaincopyprint?1. voidTextureDemo:Render()2. 3. 4. 5. if(d3dContext_=0)6. 7. return;8. 9. floatclearColor4=0.0f,0.0f,0.25f,1.0f;10. 11. d3dContext_-ClearRenderTargetView(backBufferTarget_,clearColor);12. 13. unsignedintstride=sizeof(VertexPos);14. 15. unsignedintoffset=0;16. 17. d3dContext_-IASetInputLayout(inputLayout_);18. 19. d3dContext_-IASetVertexBuf

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1