Input Layout

来源:互联网 发布:禁用的网络怎么恢复 编辑:程序博客网 时间:2024/06/05 17:40

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);// 结果处理, 查看是否失败//第二步, 创建最终的 shaderresult = d3dDevice_->CreateVertexShader(         vsBuffer->GetBufferPointer(),         vsBuffer->GetBufferSize(),         0,         &solidColorVS);// 检查是否成功if( FAILED( result)){    if( vsBuffer)        vsBuffer->Release();    return false;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有人看我脚走路怎么办 穿牛仔裤裆部有三角怎么办 我的电脑打cffps不稳定怎么办 生米煮成了熟饭该怎么办 做完下蹲腿疼该怎么办 下蹲腿的筋酸痛怎么办 躺平了 腿酸痛怎么办 500上下蹲后腿痛怎么办 蹲完马步后站不起来怎么办? 车在水里熄火了怎么办 脚磕到了很疼怎么办 破腹产4年了腰疼怎么办 蹲起之后腿疼怎么办 深蹲起跳伤腰部怎么办 蹲起膝盖有响声怎么办 腰突然不能弯了怎么办 蚂蚱吃了会过敏怎么办 孕妇能吃蚂蚱菜怎么办 孕妇吃了蚂蚁菜怎么办 白果很硬的时候怎么办 有痔疮吃了胡椒怎么办 吃紫菜多了难受怎么办 四川泡菜太酸了怎么办 孕妇吃了白花菜怎么办 怀孕吃了马扎菜怎么办 被铁钉扎伤了脚怎么办 风扇吹得肩膀疼怎么办 胳膊肌肉那块肿了怎么办 生完孩子臀部变宽怎么办 3岁宝宝肋骨外翻怎么办 胸肌正面不明显侧面看才有怎么办 小孩胸肌骨突出外翻怎么办 衣柜隔层板坏了怎么办 科三路线记不住怎么办 喂奶以后胸变小了怎么办 健身完肩膀缝疼怎么办 生过孩子胯部宽怎么办 无肩带文胸往下滑怎么办 内衣肩带老是往下滑怎么办 乳房发育一边大一边小怎么办 母猫乳房有硬块怎么办