Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx

上传人:b****5 文档编号:20066128 上传时间:2023-01-16 格式:DOCX 页数:40 大小:44.46KB
下载 相关 举报
Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx_第1页
第1页 / 共40页
Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx_第2页
第2页 / 共40页
Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx_第3页
第3页 / 共40页
Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx_第4页
第4页 / 共40页
Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx

《Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx(40页珍藏版)》请在冰豆网上搜索。

Visual C++游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形Word格式文档下载.docx

11. 

virtual 

~TriangleDemo( 

12. 

13. 

bool 

LoadContent( 

14. 

15. 

void 

UnloadContent( 

16. 

17. 

Update( 

float 

dt 

18. 

19. 

Render( 

20. 

21.private:

22. 

23. 

ID3D11VertexShader* 

solidColorVS_;

24. 

25. 

ID3D11PixelShader* 

solidColorPS_;

26. 

27. 

ID3D11InputLayout* 

inputLayout_;

28. 

29. 

ID3D11Buffer* 

vertexBuffer_;

30. 

31.};

顶点我们采用一个简单的三分量式的浮点型结构体,在XNAMathlibrary中一个叫做XMFLOAT3的结构体可以胜任这项殊荣。

接下来,开始丰富我们的TriangleDemo类,我们在代码段二中书写顶点结构体VertexPos和TriangleDemo的类的构造函数以及析构函数

代码段二TriangleDemo顶点结构体,构造函数和析构函数.

TriangleDemo.h"

3.#include<

xnamath.h>

5.struct 

VertexPos 

7.{ 

XMFLOAT3 

pos;

11.};

13.TriangleDemo:

) 

solidColorVS_( 

), 

solidColorPS_( 

15.inputLayout_( 

vertexBuffer_( 

17.{ 

19.} 

21.TriangleDemo:

23.{ 

25.} 

下面继续丰富我们的TriangleDemo类,在代码段三中我们进行UnloadContent函数的书写,顾名思义,UnloadContent是进行unloadcontent工作的,与后面将书写的LoadContent函数相对应。

代码段三TriangleDemo类的UnloadContent函数的书写

1.void 

TriangleDemo:

3.{ 

5. 

if( 

solidColorVS_ 

solidColorVS_->

Release( 

7. 

solidColorPS_ 

solidColorPS_->

inputLayout_ 

inputLayout_->

vertexBuffer_ 

vertexBuffer_->

0;

21.} 

顺理成章的,下一步便是LoadContent函数的书写。

这个函数由顶点着色器载入,在文件SolidGreenColor.fx中可以查看。

一旦顶点着色器的源代码编译完成,着色器便创建一个CreateVertexShader函数的调用,我们接着创建顶点格式。

由于顶点着色器与顶点格式相关联,所以我们还需要将顶点着色器加载到内存中。

创建完顶点着色器和输入格式后,下一步我们创建像素着色器。

下面这段代码实现了LoadContent方法的一半的功能:

代码段四 

LoadContent函数着色器载入代码

1.bool 

ID3DBlob* 

vsBuffer 

compileResult 

CompileD3DShader( 

"

SolidGreenColor.fx"

 

VS_Main"

vs_4_0"

&

== 

false 

MessageBox( 

0, 

载入顶点着色器错误!

编译错误"

MB_OK 

return 

false;

21. 

HRESULT 

d3dResult;

d3dResult 

d3dDevice_->

CreateVertexShader( 

vsBuffer->

GetBufferPointer( 

25.), 

27.vsBuffer->

GetBufferSize( 

29.if( 

FAILED( 

31.{ 

32. 

33. 

34. 

35. 

36. 

37. 

38. 

39.} 

40. 

41.D3D11_INPUT_ELEMENT_DESC 

solidColorLayout[] 

42. 

43.{ 

44. 

45.{ 

POSITION"

DXGI_FORMAT_R32G32B32_FLOAT, 

46. 

47. 

D3D11_INPUT_PER_VERTEX_DATA, 

48. 

49.};

50. 

51.unsigned 

int 

totalLayoutElements 

ARRAYSIZE( 

solidColorLayout 

52. 

53.d3dResult 

CreateInputLayout( 

solidColorLayout, 

54. 

55.totalLayoutElements, 

56. 

57.vsBuffer->

58. 

59.vsBuffer->

60. 

61.if( 

62. 

63.{ 

64. 

65. 

66. 

67.} 

68. 

69.ID3DBlob* 

psBuffer 

70. 

71.compileResult 

72. 

73."

PS_Main"

ps_4_0"

74. 

75.if( 

76. 

77.{ 

78. 

79. 

载入像素着色器错误!

80. 

81. 

82. 

83.} 

84. 

85.d3dResult 

CreatePixelShader( 

psBuffer->

86. 

87.psBuffer->

88. 

89.psBuffer->

90. 

91.if( 

92. 

93.{ 

94. 

95. 

96. 

97.} 

98. 

99.... 

100. 

101.//后接函数的下半段 

102. 

103.} 

CompileD3DShader相关的代码在代码段五中进行了演绎,这段代码巧妙地被分离于LoadContent之外,这样在加载多个不同的着色效果的时候便可以避免大段大段的冗余代码:

代码段五 

CompileShader函数的实现方法

Dx11DemoBase:

char* 

filePath, 

entry, 

3.shaderModel, 

ID3DBlob** 

buffer 

DWORD 

shaderFlags 

D3DCOMPILE_ENABLE_STRICTNESS;

#if 

defined( 

DEBUG 

|| 

_DEBUG 

|= 

D3DCOMPILE_DEBUG;

#endif 

errorBuffer 

result;

result 

D3DX11CompileFromFile( 

shaderModel, 

shaderFlags, 

buffer, 

errorBuffer, 

!

31. 

OutputDebugStringA( 

( 

)errorBuffer->

errorBuffer->

39. 

41. 

43. 

45. 

true;

47.} 

上面我们介绍了上半段LoadContent函数的构成,而下半段LoadContent函数主要实现了顶点缓存的创建。

这段代码行文思路很明朗,首先定义一个简单的三角形,沿X轴与Y轴都是0.5f(半个单位的长度)。

Z轴依然设为为0.5f,来使此三角形可见。

因为若镜头隔表面太近或者太远,表面都不会成功的渲染。

顶点列表存储于一个叫做vertices的数组中,它提供了一个子资源数据,在CreateBuffer函数开始调用进行实际顶点缓存的创建的时候,这些数据可以派上用场。

下面就是上面这段叙述的代码实现,LoadContent函数的下半部分书写风格如下:

代码段六LoadContent函数的几何图形载入代码

5.//前接函数的上半段 

9.... 

vertices[] 

XMFLOAT3( 

0.5f, 

0.5f 

-0.5f, 

};

D3D11_BUFFER_DESC 

vertexDesc;

ZeroMemory( 

vertexDesc, 

sizeof( 

vertexDesc 

vertexDesc.Usage 

D3D11_USAGE_DEFAULT;

vertexDesc.BindFlags 

D3D11_BIND_VERTEX_BUFFER;

vertexDesc.ByteWidth 

3;

D3D11_SUBRESOURCE_DATA 

resourceData;

resourceData, 

resourceData 

resourceData.pSysMem 

vertices;

CreateBuffer( 

49. 

51. 

53.} 

二、渲染几何体

Direct11三角形Demo代码的最后两部分由实现几何渲染功能的代码和着色器本身构成。

渲染几何图形的构成代码在TriangleDemo类中的Render函数中进行。

函数中有

有一个条件语句,这样可以确保在Direct3D的上下文是有效的。

接下来,我们清除渲染目标,并设定输出程序集(inputassembler)。

而实际上,因为在这个demo之中的三角形是静态的,我们并不一定非要清除渲染目标,这里只是为了规范我们的代码书写,以免养成不良的开发习惯。

在输出程序集阶段的设置由我们已经创建的输出结构(inputlayout)进行绑定,并提供顶点缓存,设置拓扑三角形的列表。

下面贴出Render函数的书写思路:

代码段七TriangleDemo类的render函数书写

d3dContext_ 

return;

clearColor[4] 

0.5, 

1.0f 

//设定背景颜色 

d3dContext_->

ClearRenderTargetView( 

backBufferTarget_, 

clearColor 

unsigned 

stride 

offset 

IASetInputLayout( 

IASetVertexBuffers( 

1, 

vertexBuffer_, 

stride, 

IASetPrimitiveTopology( 

D3D11_PRIMITIVE_TOPOLOGY_ 

TRIANGLELIST 

VSSetShader( 

solidColorVS_, 

PSSetShader( 

solidColorPS_, 

Draw( 

3, 

swapChain_->

Present( 

33.} 

最后一部分要介绍的代码是着色器。

笼统的来说,顶点着色器基于它得到的内容。

详细的来说,顶点着色器的作用是将内部得到的顶点位置传递到输出处,之后,我们须处理这些数据,正确绘制出我们的图形。

但对于这个非常基础的demo,仅仅进行顶点位置内容的传递就够了。

如果没有几何图形着色器绑定到输出程序集之上,顶点着色器的输出的数据就是像素着色器的输入的数据。

其中,像素着色器的输出就是写到输出缓存之中的颜色值。

当交换链中的Present函数调用的时候,这个缓存就会最终显示给用户。

TriangleDemo的顶点着色器和像素着色器的书写方法如下代码段八:

代码段八Triangledemo着色器的实现代码

1.float4 

VS_Main( 

float4 

pos 

POSITION 

SV_POSITION 

7.} 

9.float4 

PS_Main( 

SV_TARGET 

11.{ 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

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

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