Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

C++Directx11开发笔记三:绘制图形(2)

来源: 未知 分享至:
( FAILED( g_pd3dDevice->CreateInputLayout( layout, numElements, pVSBlob->GetBufferPointer(), 
3         pVSBlob->GetBufferSize(), &g_pVertexLayout ) ) )
4     return FALSE;
5 // Set the input layout
6 g_pImmediateContext->IASetInputLayout( g_pVertexLayout );

 

 创建Vertex Buffer

 知道了上面的内容我们还需要做一件事,在初始化时我们必须创建一个Vertex Buffer并且承载了这个顶点的数据信息。为了创建Vertex Buffer,必须填充两个结构D3D11_BUFFER_DESC和D3D11_SUBRESOURCE_DATA,然后使用ID3D11Device::CreateBuffer()方法进行创建。D3D11_BUFFER_DESC结构对Vertex Buffer要创建的内容对象进行描述,而D3D11_SUBRESOURCE_DATA则是包含了具体的数据信息,这些数据信息在创建时会进行拷贝。创建缓存和初始化是在同一时间完成的,在创建后我们可以使用ID3D11DeviceContext::IASetVertexBuffers()方法将其绑定到设备中,那样我们就可以在屏幕上呈现出来了,具体代码如下:

SimpleVertex vertices[] =
{
    XMFLOAT3( 
0.0f0.5f0.5f ),
    XMFLOAT3( 
0.5f-0.5f0.5f ),
    XMFLOAT3( 
-0.5f-0.5f0.5f ),
};
D3D11_BUFFER_DESC bd;
ZeroMemory( 
&bd, sizeof(bd) );
bd.Usage 
= D3D11_USAGE_DEFAULT;
bd.ByteWidth 
= sizeof( SimpleVertex ) * 3;
bd.BindFlags 
= D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags 
= 0;
bd.MiscFlags 
= 0;
D3D11_SUBRESOURCE_DATA InitData; 
ZeroMemory( 
&InitData, sizeof(InitData) );
InitData.pSysMem 
= vertices;
if( FAILED( g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer ) ) )
    
return FALSE;

// Set vertex buffer
UINT stride = sizeof( SimpleVertex );
UINT offset 
= 0;
g_pImmediateContext
->IASetVertexBuffers( 01&g_pVertexBuffer, &stride, &offset );

 

Primitive Topology (原型拓扑结构)

 从上面我们可以得知,如果要呈现一个三角形那样就需要将三个顶点信息告知GPU,那样如果两个三角形就必须告诉GPU6个顶点的信息,如果一个四边形(两个三角形组成),也就是说有两个顶点是共有的,PrimitiveTopology就是为了解决这个问题的。在四边形中,只要传入是个顶点信息,就可以画出四边形了,如图所示,就可以很好的理解了。

 \"\"

 如上图,如果要呈现3a中的图,只要告诉GPU是个顶点,GPU就会直接画出这个四边形了,当然也要注意一下顺序:A B C D,其实在Vertex Buffer中描述的是A B C和B C D,这样 B C两点是共用的,当然在3b图形中也一样。我们只要设置如下代码就可以得到,如下所示:

g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

 

接下来就是画出三角形,以上这些都是在设备初始化后进行的。而画出三角形就需要用到顶点和像素着色器,具体代码如下:

void Render()
{
    
// Clear the back buffer 
    float ClearColor[4= { 0.0f0.125f0.3f1.0f }; // red,green,blue,alpha
    g_pImmediateContext->ClearRenderTargetView( g_pRenderTargetView, ClearColor );

    
// Render a triangle
    g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
    g_pImmediateContext
->PSSetShader( g_pPixelShader, NULL, 0 );
    g_pImmediateContext
->Draw( 30 );

    
// Present the information rendered to the back buffer to the front buffer (the screen)

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史