原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010333737/article/details/78682213


前言

  在前几篇文章中我们主要学习了概念上的渲染管线, 那时我们更加注重说明渲染管线的含义和作用, 现在我们会转换方向, 开始学习使用API来配置渲染管线, 定义shader, 并把几何体提交到渲染管线渲染.

  我们将重点学习以下几点:

  1. 定义, 存储, 渲染图形数据的接口.
  2. 编写基础的顶点shader和像素shader.
  3. 学习如何使用渲染状态来配置渲染管线.
  4. 了解 Effect 框架如何将 shader 和渲染状态封装到一个Render Technique里, 并学习如何把效果框架作为一个shader生成器来使用.

顶点结构与描述

  之前我们提到过, 顶点可以是包含除了位置以外的很多数据, 所以为了定义我们自己的顶点, 可以借助结构体来保存我们的顶点信息. 比如下面这两种:

struct Vertex1
{
XMFLOAT3 Pos; // 位置
XMFLOAT4 Color; // 颜色
};
struct Vertex2
{
XMFLOAT3 Pos; // 位置
XMFLOAT3 Normal; // 法线
XMFLOAT2 Tex0; // 纹理坐标1
XMFLOAT2 Tex1; // 纹理坐标2
};

  当我们确定顶点格式之后, 我们会通过一个D3D11_INPUT_ELEMENT_DESC类型的数组来描述每一个分量, 这样才能让显卡知道我们传给他的数字要代表怎样的含义. 这个数组也就是输入布局(Input Layout)的描述.

typedef struct D3D11_INPUT_ELEMENT_DESC {
LPCSTR SemanticName;
UINT SemanticIndex;
DXGI_FORMAT Format;
UINT InputSlot;
UINT AlignedByteOffset;
D3D11_INPUT_CLASSIFICATION InputSlotClass;
UINT InstanceDataStepRate;
} D3D11_INPUT_ELEMENT_DESC;
  1. SemanticNameSemanticIndex: 作用如图所示, 他们与顶点shader的输入标记相映射, index的作用主要是在由相同含义的成员时不必重新定义一个名字, 比如上面顶点的两个纹理就可以用index来区分.
  2. Format: 用来告诉显卡顶点结构中的数字的格式, 是一维的标量还是三维的向量, 是浮点数还是整数.
  3. InputSlot: 指定元素来源的slot的索引, D3D支持16条slot, 你可以在这16条slot中填充顶点数据, D3D会整合所有的slot来装配一个顶点, 但是在例子中我们都只会使用一条slot.
  4. AlignedByteOffset: 对于一条slot来说, 他是从顶点结构第一元素开始计算的byte偏移, 还是之前Vertex2的例子, Pos的偏移是0, Pos是一个三维浮点数向量, 每一个float是32bits, 也就是4bytes, 所以Normal的偏移量就是12.
  5. InputSlotClassInstanceDataStepRate: 例子中暂时都会指定为 D3D11_INPUT_PER_VERTEX_DATA , 其他的格式会在以后更高级的应用场景里说明使用.

//Vertex1和Vertex2的输入描述
D3D11_INPUT_ELEMENT_DESC desc1[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12,
D3D11_INPUT_PER_VERTEX_DATA, 0}
};
D3D11_INPUT_ELEMENT_DESC desc2[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D3D11_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12,
D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24,
D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, 32,
D3D11_INPUT_PER_VERTEX_DATA, 0}
};

创建并绑定输入布局

  当定义了输入元素的描述之后, 我们就可以通过 ID3D11Device::CreateInputLayout 方法来创建输入布局( ID3D11InputLayout )了.

HRESULT ID3D11Device::CreateInputLayout(
const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs,
UINT NumElements,
const void *pShaderBytecodeWithInputSignature,
SIZE_T BytecodeLength,
ID3D11InputLayout **ppInputLayout);
  1. pInputElementDescs: 之前定义的D3D11_INPUT_ELEMENT_DESC数组.
  2. NumElements: D3D11_INPUT_ELEMENT_DESC数组的长度.
  3. pShaderBytecodeWithInputSignature: 一个带有顶点shader输入签名的shader字节码的指针.
  4. BytecodeLength: 前一个参数指明的顶点shader的bytes大小.

  这里进一步解释一下第三个参数. 顶点shader将一个名为 Input Signature 的列表作为输入参数. 用户自定义定点格式元素在传递给顶点shader时需要一一对应. 通过这个签名D3D可以验证这个对应关系并在创建的时候就完成顶点结构到shader输入的映射.

// 一种没有对应的定点结构和shader输入
VertexOut VS(
float3 Pos : POSITION,
float4 Color : COLOR,
float3 Normal : NORMAL) { } struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT4 Color;
};

  接下来说明如何使用 ID3D11Device::CreateInputLayout , 这里用到了一些还没讨论过的东西, 但是最终我们的目的是拿到之前所说的输入签名.

ID3DX11Effect* mFX;
ID3DX11EffectTechnique* mTech;
ID3D11InputLayout* mInputLayout;
// 创建 effect
mTech = mFX->GetTechniqueByName("Tech");
D3DX11_PASS_DESC passDesc;
mTech->GetPassByIndex(0)->GetDesc(&passDesc);
HR(md3dDevice->CreateInputLayout(
vertexDesc, 4,
passDesc.pIAInputSignature,
passDesc.IAInputSignatureSize,
&mInputLayout));

  这时InputLayout已经创建出来了, 但是我们还需要将他与我们用来渲染的设备进行绑定, 这里用到的是:

md3dImmediateContext->IASetInputLayout(mInputLayout);

  需要注意一点是: 输入布局与设备绑定之后直到你自己手动修改它之前都不会发生改变, 当你有不止一个输入布局时需要自己重新设置.

DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS的更多相关文章

  1. DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER

    原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  2. DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER

    原文:DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  3. DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES

    原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010 ...

  4. DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER

    原文:DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01033 ...

  5. DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

    原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ...

  6. DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS

    原文:DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  7. DirectX11笔记(三)--Direct3D初始化2

    原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...

  8. DirectX11笔记(二)--Direct3D初始化1之基本概念

    原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...

  9. DirectX11笔记(三)--Direct3D初始化代码

    原文:DirectX11笔记(三)--Direct3D初始化代码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article ...

随机推荐

  1. css3之2D 转换

    浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号. 紧跟在 -webkit-, -ms- 或 -moz- 前的数字为支持该前缀属性的第一个浏览器版本号. Chrome 和 Safari 要求 ...

  2. vue @scroll

    参考: https://blog.csdn.net/qq449736038/article/details/80769507

  3. Df- Linux必学的60个命令

    1.作用 df命令用来检查文件系统的磁盘空间占用情况,使用权限是所有用户. 2.格式 df [options] 3.主要参数 -s:对每个Names参数只给出占用的数据块总数. -a:递归地显示指定目 ...

  4. [Hdu-6053] TrickGCD[容斥,前缀和]

    Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...

  5. Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)

    P2845 [USACO15DEC]Switching on the Lights 开关灯 题意 题目背景 来源:usaco-2015-dec \(Farm\ John\)最近新建了一批巨大的牛棚.这 ...

  6. HZOI20190906模拟38 金,斯诺,赤

    题面:https://www.cnblogs.com/Juve/articles/11479415.html T1:高精度gcd,其实不用写高精度取模,gcd还有一种求法 int gcd(int a, ...

  7. day51作业

    利用无名有名分组加反向解析完成用户数据的编辑和删除功能 目录结构 day51: app01 day51 static templates manage.py 功能截图 代码实现 day51/urls. ...

  8. oslo_messaging使用eventlet executor时rpc无法调用的问题

    python2.7.5 oslo.messaging==9.8.0 现象: 从debug日志可以看到rpcServer接收到了rabbitmq的消息, 但是没有调用endpoints中的相应方法 分析 ...

  9. docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客

    原文:docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客 端口映射,data目录映射,配置文件映射(在当前目录下进行启动). docker run ...

  10. JasperReport查看和打印报告7

    报表填充过程JasperPrint对象的输出可以使用内置的浏览器组件来查看,打印或导出到更多的流行的文件格式,如PDF,HTML,RTF,XLS,ODT,CSV或XML.Jasper文件查看和打印将包 ...