Input Layout

Input Layout


原文链接:http://www.cnblogs.com/Wilson-Loo/archive/2012/12/01/2795219.html

我们通过发送一块数据到显卡来进行处理几何体的。为了告知 Direct3D我们定义了什么属性,如顺序、大小等,在此使用一种叫做 nput Layout 的结构,以让API知道如何具体处理我们将要绘制的几何体。(跟我在前面说过的那样)在DirectX11中,使用描述 *_Desc 来进行组织这些 “告知API 去做什么、怎么做、 对哪些数据进行处理” 的结构体chunk data:

typedef struct D3D11_INPUT_ELEMENT_DESC{
    LPCSTR SemanticName; //描述本结构体数据的目的;“POSITION”、“COLOR”、“NORMAL”等等。

    UINT SemanticIndex; //索引。对于某些vertex 可能有多个color描述,则 SemanticName 都为 “COLOR”,那么SemanticName = “COLOR”、SemanticIndex =0的结构体表示第一份颜色描述;SemanticName = “COLOR”、SemanticIndex =1 的结构体表示第二份颜色描述;更可能的是,同一个vertex会有多份的纹理映射坐标,这就需要编号区别了。

    DXGI_FORMAT Format; // 本结构描述的格式,例如 DXGI_FORMAT_R32G32B32_FLOAT 

    UINT InputSlot; // 也是索引,不过是用来确定 vertex buffer的,在Direct3D中,可以同时绑定多个vertex buffer,这是就需要用 inputSlot来指明我们要描述的 数据所在哪个vertex buffer中。

    UINT AlignedByteOffset; //指定 vertex buffer的开头偏移位置。

    D3D11_INPUT_CLASSIFICATION InputSlotClass; //用以区分如何处理被描述的数据,究竟是按照“per vertex”还是“per object”。

    UINT InstanceDataStepRate; // 指明同一场景中,同时能够存在多上实体。

}D3D11_INPUT_ELEMENT_DESC;

其中的 CreateInputLayout() 如

HRESULT CreateInputLayout(
    const D3D11_INPUT_ELEMENT_DESC *pInputElements,
 //创建的 InputLayout 通过一组描述_DESC创建

    UINT NumElements,   
 // 上面数组的大小,即多少个_DESC描述

    const void* pShaderBytecodeWithInputSignature, 
//对应的已编译 vertex shader code,签名要和本input layout一致

    SIZE_T BytecodeLength,
//上述 vertex shader bytecode的大小

    ID3D11InputLayout **ppInputLayout
 //最终返回结果存放。

);

 vertex shader 是已经经过编译的代码,直接由GPU 执行, 设备 device 对每一个vertex 执行vertex shader。此外 Direct3D 支持其他各种类型的 shader 。即使是渲染几何体也需要使用 shaders。

 首先, 加载并编译 vertex-shader 的文本文件(本例中的是 sampleShader.fx ) 成二进制代码, 编译后的二进制数据存放在两个buffer里面: 

ID3DBlog *vsBuffer = NULL;
ID3DBlog *errorBuffer = NULL;
// vsBuffer 是 vertex-shader-Buffer 的缩写 // ID3DBlog 定义内存块, 用以存放大数据(的吧, 我联想到数据库的blog数据类型); 用处是作为数据缓存, 可用于存储vertex, adjacency, 以及在处理网格优化时的 meterial材质信息等.还可作为使用API编译 vertex, geometry, pixel-shader 时的返回值(此例如是)

不过 errorBuffer 用以存储错误、警告等信息, 实际有效地二进制代码将会进入vsBuffer( vertex-shader-Buffer);

第二步骤, 直接使用 CreateVertexShader()函数, 将编译好的二进制数据(存放于vsBuffer内)作为输入,创建 vertexShapder。 

 如下所示:

// 声明定义各种 条件, 存储位置
// 第一步: 编译 shader文件
result = D3DX11CompileFromFile( 
        "sampleShader.fx", 
        0, 
        0, 
        "VS_Main", 
        "vs_4_0", 
        shaderFlags, 
        0, 
        0, 
        &vsBuffer, 
        &errorBuffer, 
        0
);

// 结果处理, 查看是否失败

//第二步, 创建最终的 shader
result = d3dDevice_->CreateVertexShader( 
        vsBuffer->GetBufferPointer(), 
        vsBuffer->GetBufferSize(), 
        0, 
        &solidColorVS);

// 检查是否成功
if( FAILED( result))
{
    if( vsBuffer)
        vsBuffer->Release();

    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值