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; }
相关文章推荐
- 代码实现 UITableView与UITableViewCell
- linux下部署项目后可能出现的问题 ;(是无效,Web server process 写入资料的目录)
- nginx 反向代理 504 错误
- protobuf简介
- Bash学习手册
- 富文本 WPAttributedMarkup
- 使用Material Design 创建App翻译系列----材料主题的使用(Using Material Theme)
- 黑马程序员---C语言基础---语句概述
- 概率机器学习和人工智能(Probabilistic machine learning and artificial intelligence_Nature2015)
- JSTL 核心标签库 使用
- [转]overload和override的区别
- 如何对数据库中的表以及表中的字段进行重命名
- RHEL6.3解决Device eth0 does not seem to be present
- Objective-C第六版第12章----Preprocessor
- SVN clean Up 失败处理方法
- jquery attr和css属性
- 穿越冰冷的科技,语音交互之下的爱情——电影《her》
- Android 开发系列5 使用netty
- 为 armhf 版本Ubuntu 14.04 系统增加Flash和Netflix支持
- MACHINE_START与MACHINE_END