VC++游戏开发随记之二十九文档格式.docx
《VC++游戏开发随记之二十九文档格式.docx》由会员分享,可在线阅读,更多相关《VC++游戏开发随记之二十九文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
Dx11DemoBase
4.
5.{
6.
7.public:
8.
9.
TriangleDemo(
);
10.
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_(
0
),
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,仅仅进行顶点位置内容的传递就够了。
如果没有几何图形着色器绑定到输出程序集之上,顶点