1、11. virtualTriangleDemo(12. 13. boolLoadContent(14. 15. voidUnloadContent(16. 17. Update(floatdt18. 19. Render(20. 21. private:22. 23. ID3D11VertexShader*solidColorVS_;24. 25. ID3D11PixelShader*solidColorPS_;26. 27. ID3D11InputLayout*inputLayout_;28. 29. ID3D11Buffer*vertexBuffer_;30. 31. ;顶点我们采用一个简
2、单的三分量式的浮点型结构体,在XNA Math library中一个叫做XMFLOAT3的结构体可以胜任这项殊荣。接下来,开始丰富我们的TriangleDemo类,我们在代码段二中书写顶点结构体VertexPos和TriangleDemo的类的构造函数以及析构函数代码段二 TriangleDemo 顶点结构体, 构造函数和析构函数.TriangleDemo.h3. #include5. structVertexPos7. XMFLOAT3pos;11. ;13. TriangleDemo:)solidColorVS_(0),solidColorPS_(15. inputLayout_(vert
3、exBuffer_(17. 19. 21. TriangleDemo:23. 25. 下面继续丰富我们的TriangleDemo类,在代码段三中我们进行UnloadContent函数的书写,顾名思义,UnloadContent是进行unload content工作的,与后面将书写的LoadContent函数相对应。代码段三 TriangleDemo类的UnloadContent函数的书写1. voidTriangleDemo:3. 5. if(solidColorVS_solidColorVS_-Release(7. solidColorPS_solidColorPS_-inputLayout
4、_inputLayout_-vertexBuffer_vertexBuffer_-=0;21. 顺理成章的,下一步便是LoadContent函数的书写。这个函数由顶点着色器载入,在文件SolidGreenColor.fx中可以查看。一旦顶点着色器的源代码编译完成,着色器便创建一个CreateVertexShader函数的调用,我们接着创建顶点格式。由于顶点着色器与顶点格式相关联,所以我们还需要将顶点着色器加载到内存中。创建完顶点着色器和输入格式后,下一步我们创建像素着色器。下面这段代码实现了LoadContent方法的一半的功能:代码段四 LoadContent函数着色器载入代码1. bool
5、ID3DBlob*vsBuffercompileResultCompileD3DShader(SolidGreenColor.fx,VS_Mainvs_4_0&=falseMessageBox(0,载入顶点着色器错误!编译错误MB_OKreturnfalse;21. HRESULTd3dResult;d3dResultd3dDevice_-CreateVertexShader(vsBuffer-GetBufferPointer(25. ),27. vsBuffer-GetBufferSize(29. if(FAILED(31. 32. 33. 34. 35. 36. 37. 38. 39. 4
6、0. 41. D3D11_INPUT_ELEMENT_DESCsolidColorLayout42. 43. 44. 45. POSITIONDXGI_FORMAT_R32G32B32_FLOAT,46. 47. D3D11_INPUT_PER_VERTEX_DATA,48. 49. ;50. 51. unsignedinttotalLayoutElementsARRAYSIZE(solidColorLayout52. 53. d3dResultCreateInputLayout(solidColorLayout,54. 55. totalLayoutElements,56. 57. vsBu
7、ffer-58. 59. vsBuffer-60. 61. if(62. 63. 64. 65. 66. 67. 68. 69. ID3DBlob*psBuffer70. 71. compileResult72. 73. PS_Mainps_4_074. 75. if(76. 77. 78. 79. 载入像素着色器错误!80. 81. 82. 83. 84. 85. d3dResultCreatePixelShader(psBuffer-86. 87. psBuffer-88. 89. psBuffer-90. 91. if(92. 93. 94. 95. 96. 97. 98. 99. .1
8、00. 101. /后接函数的下半段102. 103. CompileD3DShader相关的代码在代码段五中进行了演绎,这段代码巧妙地被分离于LoadContent之外,这样在加载多个不同的着色效果的时候便可以避免大段大段的冗余代码:代码段五 CompileShader 函数的实现方法Dx11DemoBase:char*filePath,entry,3. shaderModel,ID3DBlob*bufferDWORDshaderFlagsD3DCOMPILE_ENABLE_STRICTNESS;#ifdefined(DEBUG|_DEBUG|=D3DCOMPILE_DEBUG;#endif
9、errorBufferresult;resultD3DX11CompileFromFile(shaderModel,shaderFlags,buffer,errorBuffer,!31. OutputDebugStringA()errorBuffer-errorBuffer-39. 41. 43. 45. true;47. 上面我们介绍了上半段LoadContent函数的构成,而下半段LoadContent函数主要实现了顶点缓存的创建。这段代码行文思路很明朗,首先定义一个简单的三角形,沿X轴与Y轴都是0.5f(半个单位的长度)。Z轴依然设为为0.5f,来使此三角形可见。因为若镜头隔表面太近或者
10、太远,表面都不会成功的渲染。顶点列表存储于一个叫做vertices的数组中,它提供了一个子资源数据,在CreateBuffer函数开始调用进行实际顶点缓存的创建的时候,这些数据可以派上用场。下面就是上面这段叙述的代码实现,LoadContent函数的下半部分书写风格如下:代码段六 LoadContent函数的几何图形载入代码5. /前接函数的上半段9. .verticesXMFLOAT3(0.5f,0.5f-0.5f,;D3D11_BUFFER_DESCvertexDesc;ZeroMemory(vertexDesc,sizeof(vertexDescvertexDesc.UsageD3D11
11、_USAGE_DEFAULT;vertexDesc.BindFlagsD3D11_BIND_VERTEX_BUFFER;vertexDesc.ByteWidth*3;D3D11_SUBRESOURCE_DATAresourceData;resourceData,resourceDataresourceData.pSysMemvertices;CreateBuffer(49. 51. 53. 二、渲染几何体Direct11三角形Demo代码的最后两部分由实现几何渲染功能的代码和着色器本身构成。渲染几何图形的构成代码在TriangleDemo类中的Render函数中进行。函数中有有一个条件语句,这
12、样可以确保在Direct3D的上下文是有效的。接下来,我们清除渲染目标,并设定输出程序集(input assembler)。而实际上,因为在这个demo之中的三角形是静态的,我们并不一定非要清除渲染目标,这里只是为了规范我们的代码书写,以免养成不良的开发习惯。在输出程序集阶段的设置由我们已经创建的输出结构(input layout)进行绑定,并提供顶点缓存,设置拓扑三角形的列表。下面贴出Render函数的书写思路:代码段七 TriangleDemo类的render函数书写d3dContext_return;clearColor40.5,1.0f/设定背景颜色d3dContext_-ClearR
13、enderTargetView(backBufferTarget_,clearColorunsignedstrideoffsetIASetInputLayout(IASetVertexBuffers(1,vertexBuffer_,stride,IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELISTVSSetShader(solidColorVS_,PSSetShader(solidColorPS_,Draw(3,swapChain_-Present(33. 最后一部分要介绍的代码是着色器。笼统的来说,顶点着色器基于它得到的内容
14、。详细的来说,顶点着色器的作用是将内部得到的顶点位置传递到输出处,之后,我们须处理这些数据,正确绘制出我们的图形。但对于这个非常基础的demo,仅仅进行顶点位置内容的传递就够了。如果没有几何图形着色器绑定到输出程序集之上,顶点着色器的输出的数据就是像素着色器的输入的数据。其中,像素着色器的输出就是写到输出缓存之中的颜色值。当交换链中的Present函数调用的时候,这个缓存就会最终显示给用户。TriangleDemo的顶点着色器和像素着色器的书写方法如下代码段八:代码段八 Triangledemo着色器的实现代码1. float4VS_Main(float4posPOSITIONSV_POSITION7. 9. float4PS_Main(SV_TARGET11.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1