(4)Render函数
默认定义在CubeRenderer.cpp源文件中的Render函数用于绘制立体图形,此函数的实现代码如下所示:
void CubeRenderer::Render()
{
//背景色
const float midnightBlue[] = {0.098f,0.098f,0.439f,1.000f};
//设置背景
m_d3dContext->ClearRenderTargetView(
m_renderTargetView.Get(),
midnightBlue
);
//清空深度缓存和模版缓存
m_d3dContext->ClearDepthStencilView(
m_depthStencilView.Get(),
D3D11_CLEAR_DEPTH,
1.0f,
0
);
if (!m_loadingComplete)
{
return;
}
//绑定到图形管线的output-merger stage阶段
m_d3dContext->OMSetRenderTargets(
1,
m_renderTargetView.GetAddressOf(),
m_depthStencilView.Get()
);
m_d3dContext->UpdateSubresource(
m_constantBuffer.Get(),
0,
NULL,
&m_constantBufferData,
0,
0
);
UINT stride = sizeof(VertexPositionColor);
UINT offset = 0;
//将顶点缓存绑定到图形管线的input-assembler stage阶段
m_d3dContext->IASetVertexBuffers(
0,
1,
m_vertexBuffer.GetAddressOf(),
&stride,
&offset
);
//将顶点索引的缓存绑定到图形管线的input-assembler stage阶段
m_d3dContext->IASetIndexBuffer(
m_indexBuffer.Get(),
DXGI_FORMAT_R16_UINT,
0
);
//设置图元的拓扑结构为为三角形列表
m_d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
//设置输入格式
m_d3dContext->IASetInputLayout(m_inputLayout.Get());
//设置顶点着色器
m_d3dContext->VSSetShader(
m_vertexShader.Get(),
nullptr,
0
);
//顶点着色器的常量缓存
m_d3dContext->VSSetConstantBuffers(
0,
1,
m_constantBuffer.GetAddressOf()
);
//设置像素着色器
m_d3dContext->PSSetShader(
m_pixelShader.Get(),
nullptr,
0
);
//绘制立体图型
m_d3dContext->DrawIndexed(
m_indexCount,
0,
0
);
}
在上面的代码中,首先定义一个const float类型的数组midnightBlue,用来存储一个RGBA颜色值,并在ClearRenderTargetView函数中使用这个颜色值来设置应用窗口的背景。接着调用ClearDepthStencilView函数清空深度缓存和模版缓存,其中深度缓存用于进行深度测试,经过深度测试以后在应用窗口中将实现靠近屏幕的物体遮挡远离屏幕的物体的效果,而模版缓存则用于将像素进行模版测试,经过模版测试后此像素将可以写入到后台缓存中。
接下来将相应的数据绑定到图形管线的output-merger stage阶段,以便于最终将图形绘制到应用窗口中。调用OMSetRenderTargets函数将渲染目标视图和深度模版视图绑定到图形管线的output-merger stage阶段,这两个视图是绘制立体图形的过程中所需要的资源。然后调用IASetVertexBuffers函数和IASetIndexBuffer函数分别将顶点缓存和顶点索引缓存绑定到图形管线的output-merger stage阶段。
调用IASetPrimitiveTopology函数设置图元的拓扑结构为三角形列表,并调用VSSetShader函数和VSSetConstantBuffers函数来分别设置顶点着色器和顶点着色器的常量缓存,接着调用PSSetShader函数来设置像素着色器,最后调用DrawIndexed函数来绘制立体图形。