braynzarsoft-D3D11
+ -

04.开始绘制3

2024-06-11 21 0

创建顶点缓冲区

现在我们需要创建顶点缓冲区。我们首先使用“顶点”结构制作一个顶点数组。
在我们有了一个顶点数组后,我们将通过填充D3D11_BUFFER_DESC 结构来描述我们的顶点缓冲区,并通过调用ZeroMemory()来确保它是空的。D3D11_BUFFER_DESC如下所示:

typedef struct D3D11_BUFFER_DESC
{
   UINT             ByteWidth;
   D3D11_USAGE      Usage;
   UINT             BindFlags;
   UINT             CPUAccessFlags;
   UINT             MiscFlags;
   UINT             StructureByteStride;
}D3D11_BUFFER_DESC;
  • ByteWidth :缓冲区总字节大小
  • Usage :D3D11_USAGE类型,描述如何读取和写入缓冲区。
  • BindFlags :我们指定D3D11_BIND_VERTEX_BUFFER,因为这是一个顶点缓冲区。
  • CPUAccessFlags :这说明了CPU将如何使用我们的缓冲区。我们可以将其设置为NULL
  • MiscFlags :额外的标识。我们不用,设置为NULL.
  • StructureByteStride :我们不用,设为NULL.

现在我们有了缓冲区的描述,我们需要用缓冲区中所需的数据填充D3D11_SUBRESOURCE_DATA结构。结构如下所示:

typedef struct D3D11_SUBRESOURCE_DATA
{
   const    void *pSysMem;
   UINT     SysMemPitch;
   UINT     SysMemSlicePitch;
} D3D11_SUBRESOURCE_DATA;
  • pSysMem :缓冲区指针
  • SysMemPitch :这是纹理中从一行到下一行的距离(以字节为单位)。它仅用于2D和3D纹理。
  • SysMemSlicePitch :在3D纹理中,从一个深度级别到下一深度级别的距离(以字节为单位)。仅用于3D纹理。

现在,我们终于可以使用刚才创建的缓冲区描述和缓冲区数据创建缓冲区了。要创建缓冲区,我们所要做的就是调用ID3D11Device::CreateBuffer()。函数如下所示:

HRESULT CreateBuffer( 
   [in]    const D3D11_BUFFER_DESC *pDesc,
   [in]    const D3D11_SUBRESOURCE_DATA *pInitialData,
   [in]    ID3D11Buffer **ppBuffer
);

参数如下:

  • pDesc :缓冲区描述结构体指针
  • pInitialData:指向子资源数据结构的指针,该数据结构包含我们要放在此处的数据。如果以后要添加数据,我们可以将其设置为NULL。
  • ppBuffer :缓冲区指针返回
Vertex v[] =
{
    Vertex( 0.0f, 0.5f, 0.5f ),
    Vertex( 0.5f, -0.5f, 0.5f ),
    Vertex( -0.5f, -0.5f, 0.5f ),
};

D3D11_BUFFER_DESC vertexBufferDesc;
ZeroMemory( &vertexBufferDesc, sizeof(vertexBufferDesc) );

vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
vertexBufferDesc.ByteWidth = sizeof( Vertex ) * 3;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA vertexBufferData; 

ZeroMemory( &vertexBufferData, sizeof(vertexBufferData) );
vertexBufferData.pSysMem = v;
hr = d3d11Device->CreateBuffer( &vertexBufferDesc, &vertexBufferData, &triangleVertBuffer);

设置顶点缓冲

现在我们有了顶点缓冲区,我们需要将其绑定到IA。我们可以通过调用函数ID3D11Devicecontext::IASetVertexBuffers函数来实现这一点:

void IASetVertexBuffers(
   [in]   UINT StartSlot,
   [in]   UINT NumBuffers,
   [in]   ID3D11Buffer *const *ppVertexBuffers,
   [in]   const UINT *pStrides,
   [in]   const UINT *pOffsets
);
  • StartSlot :这是我们可以将其绑定到的输入插槽。我们在此处设置0。
  • NumBuffers :绑定的缓冲区数量。这里为1。
  • ppVertexBuffers :顶点缓冲区指针
  • pStrides :每个顶眯的大小
  • pOffsets :缓冲区开始的偏移字节大小。
UINT stride = sizeof( Vertex );
UINT offset = 0;
d3d11DevCon->IASetVertexBuffers( 0, 1, &triangleVertBuffer, &stride, &offset );

创建顶点输入布局

顶点着色器需要顶点缓冲区布局与顶点建立联系。
顶点缓冲区布局使用函数ID3D11Device::CreateInputLayout()来完成此操作。

HRESULT CreateInputLayout( 
   [in]   const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs,
   [in]   UINT NumElements,
   [in]   const void *pShaderBytecodeWithInputSignature,
   [in]   SIZE_T BytecodeLength,
   [out]  ID3D11InputLayout **ppInputLayout
);
  • pInputElementDescs :包含顶点布局的D3D11_INPUT_ELEMENT_DESC元素的数组。
  • NumElements :顶点布局中的元素数量。
  • pShaderBytecodeWithInputSignature :这是一个指向“顶点着色器”起点的指针。
  • BytecodeLength :这是顶点着色器的大小。
  • ppInputLayout :这是返回的指向我们的输入(顶点)布局的指针。
hr = d3d11Device->CreateInputLayout( layout, numElements, VS_Buffer->GetBufferPointer(), 
    VS_Buffer->GetBufferSize(), &vertLayout );

设置顶点输入布局

已经创建了顶点布局,接下来要做的是将其绑定到IA作为活动输入(顶点)布局。

void STDMETHODCALLTYPE IASetInputLayout( 
   [in]   ID3D11InputLayout *pInputLayout
);

这个函数只有一个参数,就是我们创建的输入布局。

d3d11DevCon->IASetInputLayout( vertLayout );

设置基本拓扑

这是我们告诉IA我们要发送的基元类型的地方。我们可以通过调用函数ID3D11DeviceContext::IASetPrimitiveTopology()来设置基元拓扑。这里唯一的参数是D3D11_PRIITIVE_TOPOLOGY枚举类型。以下是常见类型的列表:

D3D10_PRIMITIVE_TOPOLOGY_POINTLIST
D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP
D3D10_PRIMITIVE_TOPOLOGY_LINELIST
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ

我们的是三角形列表,即每3个顶点组成一个三角形。

d3d11DevCon->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

详见:https://blog.csdn.net/qq826364410/article/details/103785437

0 篇笔记 写笔记

顶点着色器VertexShader
什么是顶点着色器?顶点着色器是一组指令代码,这组指令代码在顶点被渲染时执行。同一时间内,只能激活一个顶点着色器。每个源顶点着色器最多拥有128条指令(DirextX8.1),而在DirectX9,则可以达到256条。为什么大家要使用顶点着色器?顶点着色器可以提高渲染场景速度(直接由显卡自动调用......
D3D11顶点缓存
在D3D11程序中,我们要绘制的每一个物体,它对应的所有顶点及索引信息,都需要存放在相应的缓存中。因此我们需要在初始化阶段为顶点和索引来创建相应的缓存。顶点缓存和索引缓存的创建方式十分类似,即先定义缓存描述,再创建缓存数据(即顶点数组和索引数组),最后通过描述和缓存数据来创建缓存。设置 D3D1......
04.开始绘制3
创建顶点缓冲区现在我们需要创建顶点缓冲区。我们首先使用“顶点”结构制作一个顶点数组。在我们有了一个顶点数组后,我们将通过填充D3D11_BUFFER_DESC 结构来描述我们的顶点缓冲区,并通过调用ZeroMemory()来确保它是空的。D3D11_BUFFER_DESC如下所示:typedef ......
06.顶点索引
使用索引可以定义如何绘制几何体。例如,可以通过创建两个三角形来绘制一个正方形,每个三角形有3个顶点。这就需要创建6个顶点。使用索引缓冲区,您可以像我们将要做的那样只使用4个顶点创建一个正方形。我们的索引列表将第一个三角形定义为顶点0、1、2,第二个顶点定义为0、2、3。本节的源代码下载地址:h......
2.2.1缓冲区资源-顶点缓冲区
2.1资源解析既然我们已经了解了资源和资源视图的一些基本原理,现在是时候开始对各种类型的资源进行更详细的检查了,看看是什么使它们彼此不同,以及它们可以做什么。本节将介绍每种类型的资源,并讨论它们可以用来创建的每种可用子类型。我们从缓冲区资源开始,探索可以使用的每种缓冲区类型及其各种属性。接下来是关于......
3.4 顶点着色器-简介
渲染管道中的第一个可编程着色器阶段是顶点着色器。如上所述,可编程着色器阶段执行用HTSL编写的自定义函数。在顶点着色器阶段的情况下,顶点着色器程序是为输入装配程序生成的顶点流中的每个顶点调用一次的函数。每个输入顶点都作为顶点着色器程序的参数接收,并且处理后的顶点作为函数的结果返回。每个顶点着色器调用......
3.4.1顶点着色器管道输入
由于顶点着色器直接位于管道中的输入装配程序之后,因此它自然会从那里接收输入。配置输入装配程序的输入布局所做的所有工作都旨在使创建的顶点顶点着色器阶段的当前程序所期望的格式相匹配。这就是为什么在创建ID3DllInputl_ayout对象时需要将编译的着色器字节代码作为输入,以确保组装的顶点与执行顶......
顶点结构体gs_vb_data和gs_vertex_buffer
以下内容来自于d3d11-subsystem和d3d11-subsystem的分析gs_vb_data结构体用于存储顶点数据数组,数组大小由num成员决定。另外这个顶点数据的内容不是单一类型顶点,而是可以包含很多,因指针是否为空而确定是否存在。基础结构体定义如下:struct vec3 {......
3.4.2顶点着色器状态配置
作为可编程着色器阶段,顶点着色器实现通用着色器核心功能。这意味着它提供了一组标准的资源接口方法,允许应用程序向着色器程序提供对所需资源的访问。与所有管道操作一样,所有可以更改顶点着色器阶段状态的方法都属于ID3DllDeviceContext接口。我们将查看这些可用资源中的每一个,并了解它们在顶点着......
3.4.3顶点着色器阶段处理
我们现在知道顶点着色器可以从输入装配程序接收哪些数据作为输入数据,以及哪些资源可以被主机应用程序绑定。顶点绘冲区常量缓冲区着色器资源视图我们还知道,顶点着色器程序提供了对单个顶点的自定义处理,而与调用管道的拓扑无关。那么,在顶点着色器程序中执行哪些类型的操作呢?某些类型的操作更适合这个阶段的组......
3.4.4顶点着色器管道输出
在决定在输出顶点结构中包括哪些信息时,需要考虑如何使用管道的其余部分。图3.18显示了渲染管道的框图。顶点着色器阶段之后是一组曲面细分阶段(外壳着色器、曲面细分器和域着色器阶段),然后是几何体着色器,然后是光栅化器阶段。根据顶点着色器和光栅化器阶段之间这些阶段中的哪一个处于活动状态,必须满足不同的......
D3D11 IASetVertexBuffers 函数与顶点数据的两种组织方式
D3D11中的 IASetVertexBuffers 函数用来向GPU传递顶点数据。一般情况下,我都是传入一个buff,也即在0号slot上绑定了一个buff,其他slot都没有绑定buff。我传入的这个buff,是一个存储了顶点结构体数据的数组,每个顶点结构体中都有Position成员,Color......
作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!