您的位置:首页 > 其它

Input Layout

2015-07-02 10:40 225 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: