DX10基础学习笔记(2)

 Tutorial02和Turorial03程序代码一样,在屏幕上绘制一个三角形,主要涉及2个主要方面的工作:创建要绘制的三角形几何数据;创建几何体的渲染效果。最后在渲染函数中进行设置。

1.创建几何数据,并将数据送入GPU
(1)定义顶点数据结构
struct SimpleVertex
{
    D3DXVECTOR3 Pos; 
};
(2)向GPU描述顶点结构。由于顶点通过顶点缓冲区送入GPU中处理,因此需要向GPU说明送入的数据是怎样的一个格式,说明方法如下:
// 声明输入格式
D3D10_INPUT_ELEMENT_DESC layout[] =
{
    { L"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
};
UINT numElements = sizeof(layout)/sizeof(layout[0]);
// 创建输入格式
D3D10_PASS_DESC PassDesc;
g_pTechnique->GetPassByIndex( 0 )->GetDesc( &PassDesc );
g_pd3dDevice->CreateInputLayout( layout, numElements, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &g_pVertexLayout );
// 设置输入格式(将输入的格式传给GPU)
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );
(3)创建描述几何体形状的顶点缓冲区
// 创建顶点缓冲区
SimpleVertex vertices[] =
{
    D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
    D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
    D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
};
D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_DEFAULT;
bd.ByteWidth = sizeof( SimpleVertex ) * 3;
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = vertices;
g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer );
// 设置顶点缓冲区
UINT stride = sizeof( SimpleVertex );
UINT offset = 0;
g_pd3dDevice->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );

2. 定义效果,即用HLSL语言创建shader文件,包括顶点着色器和像素着色器(好像还有几何着色器Geometry Shader),以及渲染效果
(1)顶点着色器
float4 VS(float4 Pos : POSITION) : SV_POSITION
{
 return Pos;
}
(2)像素着色器
float4 PS(float4 Pos : SV_POSITION) : SV_TARGET
{
 return (1.0f, 1.0f, 0.0f, 1.0f); // r,g,b,a
}
(3)渲染效果(Technique10)。即VS,GS,PS的组合即为一个通道(Pass),多个通道的集合称为Technique10
technique10 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );
    }
}

3.创建效果
// Create the effect
D3DX10CreateEffectFromFile( L"Tutorial03.fx", NULL, NULL, D3D10_SHADER_ENABLE_STRICTNESS, 0, g_pd3dDevice, NULL, NULL, &g_pEffect, NULL )
// Obtain the technique
g_pTechnique = g_pEffect->GetTechniqueByName( "Render" );

4. 渲染几何体
(1)如果几何体由多个三角形组成,需要指明顶点缓冲区的访问方法是简单三角形列表,三角形条带,三角形扇面。
g_pd3dDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
(2)在Render函数中,应用渲染效果,绘制几何体
D3D10_TECHNIQUE_DESC techDesc;
g_pTechnique->GetDesc( &techDesc );
for( UINT p = 0; p < techDesc.Passes; ++p )
{
    g_pTechnique->GetPassByIndex( p )->Apply(0);
    g_pd3dDevice->Draw( 3, 0 );
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值