首先,什么是缓冲区:

缓冲区是.fx文件的影响(.ps .vs还) 一种数据结构,其定义了。为.fx和cpp数据通信文件。

例:

//--------------------------------------------------------------------------------------
// Constant Buffer Variables
//--------------------------------------------------------------------------------------
cbuffer ConstantBuffer
{
matrix World;
matrix View;
matrix Projection;
};
cbuffer LightBuffer
{
float3 cameraPosition;
float padding;
};

cbuffer是keyword。  类似于struct

这里就定义了2个缓冲区。

在程序执行的时候。

效果文件.fx须要获得世界矩阵观察矩阵投影矩阵等等。 因此就须要为这个缓冲区赋值。一方面能够直接写在.fx文件中面。

可是

直接写在效果文件 编译后就不能动态改变了,没有灵活性。

以下说说2种缓冲区

1:静态常量缓冲区

所谓静态就是在渲染器初始化的时候,就为缓冲区赋值好了。不会再变了。

// Create the constant buffer
D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(ConstantBuffer);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
hr = device->CreateBuffer( &bd, NULL, &m_matrixBuffer );
if( FAILED( hr ) )
return hr;

上面就是创建一个静态缓冲区的列子

当中bd.Usage属性  

D3D11_USAGE_DEFAULT

意思是 cpu在执行过程中不可以再读写数据了

bd.COUAccessFlags=0 也得设置为0才行。

定义好缓冲区结构之后就是初始化了

//
// Update variables
//
ConstantBuffer cb;
cb.mWorld = XMMatrixTranspose( worldMatrix);
cb.mView = XMMatrixTranspose( viewMatrix );
cb.mProjection = XMMatrixTranspose( projectionMatrix );
deviceContext->UpdateSubresource( m_matrixBuffer, 0, NULL, &cb, 0, 0 );
deviceContext->VSSetConstantBuffers( 0, 1, &m_matrixBuffer );

初始化非常easy 这里拿世界矩阵 视图矩阵 投影矩阵为样例

2:动态顶点缓冲区

和静态缓冲区不同。

动态缓冲区用于每一帧都须要动态改变渲染数据的情况。

比方水波,每一秒他的顶点结构都在变,因此须要用动态缓冲区动态赋值,而不是在初始化赋值

//create the light buffer
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DYNAMIC;
bd.ByteWidth = sizeof(LightBuffer);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
hr = device->CreateBuffer( &bd, NULL, &m_lightmaterialBuffer );
if( FAILED( hr ) )
return hr;
return S_OK;

定义基本一样。,仅仅是在Usage 里面要设置为D3D11_USAGE_DYNAMIC  还有CPUAccessFlags也要设置为D3D11_CPU_ACCESS_WRITE

并且在更新数据的时候不一样

必须先用map锁定,防止还没更新好的时候设备就渲染了造成错误数据不一致

D3D11_MAPPED_SUBRESOURCE mappedResource;
ConstantBuffer *data0;
LightBuffer *data1;
//
// Update variables
//
//ConstantBuffer cb;
//cb.mWorld = XMMatrixTranspose( worldMatrix);
//cb.mView = XMMatrixTranspose( viewMatrix );
//cb.mProjection = XMMatrixTranspose( projectionMatrix );
//锁定常量缓冲区
HR(deviceContext->Map(m_matrixBuffer,0,D3D11_MAP_WRITE_DISCARD,0,&mappedResource));
//deviceContext->UpdateSubresource( m_matrixBuffer, 0, NULL, &cb, 0, 0 );
data0=(ConstantBuffer*)mappedResource.pData;
data0->mWorld=XMMatrixTranspose( worldMatrix);
data0->mView=XMMatrixTranspose( viewMatrix );
data0->mProjection=XMMatrixTranspose( projectionMatrix );
deviceContext->Unmap(m_matrixBuffer,0);
deviceContext->VSSetConstantBuffers( 0, 1, &m_matrixBuffer );
//LightBuffer lb;
//lb.cameraPosition=cameraPos;
//锁定光照缓冲区
HR(deviceContext->Map(m_lightmaterialBuffer,0,D3D11_MAP_WRITE_DISCARD,0,&mappedResource));
data1=(LightBuffer*)mappedResource.pData;
data1->cameraPosition=cameraPos;
deviceContext->Unmap(m_lightmaterialBuffer,0);
//deviceContext->UpdateSubresource( m_lightmaterialBuffer, 0, NULL, &lb, 0, 0 );
deviceContext->VSSetConstantBuffers( 1, 1, &m_lightmaterialBuffer );

这里举了2个样例,同一时候渲染了2个缓冲区。

要注意的是,渲染两个缓冲区的时候,不是简单的先写第一个再写第二个。

有一点小差别。

就是在deviceContext->VSSetConstantBuffers()当要加入的第一参数1. 它代表了一个第二缓冲。其他的都一样。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

DirectX11 学习笔记9 - 动态顶点缓冲区 和 静态顶点缓冲区的更多相关文章

  1. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

  2. Directx11学习笔记【二十二】 用高度图实现地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...

  3. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  4. Directx11学习笔记【一】 最简单的windows程序HelloWin

    声明:本系列教程代码有部分来自dx11龙书及dx11游戏编程入门两本书,后面不再说明 首先,在vs2013中创建一个空的解决方案Dx11Demo,以后的工程都会放在这个解决方案下面.然后创建一个win ...

  5. Web Service学习笔记:动态调用WebService

    原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...

  6. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL 如果使用JDBC或者其他框架,很多时候需要你根据需求手动拼装SQL语句,这是一件非常麻烦的事情.MyBatis提供了对SQL语句动态的组装能力,而且他只有 ...

  7. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  8. [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good

    [C++学习笔记14]动态创建对象   C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...

  9. SpringBoot学习笔记:动态数据源切换

    SpringBoot学习笔记:动态数据源切换 数据源 Java的javax.sql.DataSource接口提供了一种处理数据库连接的标准方法.通常,DataSource使用URL和一些凭据来建立数据 ...

随机推荐

  1. 由于“Table(T_Test)”没有主键,因此无法在其上执行 Create、Update 或 Delete 操作

    在使用Linq To Sql查询的时候,遇到这么个问题,如图所示: 出现这个问题的原因就像途中所说的——没有主键(现在终于初步知道“为什么别人常说数据库中的逻辑主键是为了在编程中方便使用”的原因了,估 ...

  2. 从response.header中提取cookie,在request里添加cookie

    //        List<String> resp = new ArrayList<String>();  //        HeaderIterator headers ...

  3. 基于visual Studio2013解决面试题之0405和最大的子矩阵

     题目

  4. android 5.0新特性

    Android Lollipop 面向开发人员的主要功能 Material Design 设计 注重性能 通知 以大屏幕呈现 以文档为中心 连接性能再上一级 高性能图形 音频处理功能更强 摄像头和视频 ...

  5. hdu 1262 寻找素数对 数论 打表。

    寻找素数对 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. libevent简单分析

    一看名字就知道是围绕eventloop转的. 那首先肯定是eventloop是个什么?一般都是IO事件,timer事件的管理器. 那首先看如何new出来一个eventloop: 1.因为libeven ...

  7. Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单

    {================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单 ...

  8. OCM读书笔记(2) - PL/SQL 基础

    1. % type 用法,提取% type所在字段的类型 declare     myid dept.deptno % type;    myname dept.dname % type;begin  ...

  9. java面向对象下:JavaXML解析技术

    20.JavaXML解析技术: XML概述:        XML可扩展标记性语言,用于数据表达和数据传递. XML语法规则:        合法DTDXML:1.内部DTD(和XML一起):2.外部 ...

  10. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信

    原文:与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信 [索引页][源码下载] 与众不同 windows phone (29) - Co ...