首先,什么是缓冲区:

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

例:

  1. //--------------------------------------------------------------------------------------
  2. // Constant Buffer Variables
  3. //--------------------------------------------------------------------------------------
  4. cbuffer ConstantBuffer
  5. {
  6. matrix World;
  7. matrix View;
  8. matrix Projection;
  9. };
  10. cbuffer LightBuffer
  11. {
  12. float3 cameraPosition;
  13. float padding;
  14. };

cbuffer是keyword。  类似于struct

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

在程序执行的时候。

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

可是

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

以下说说2种缓冲区

1:静态常量缓冲区

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

  1. // Create the constant buffer
  2. D3D11_BUFFER_DESC bd;
  3. ZeroMemory( &bd, sizeof(bd) );
  4. bd.Usage = D3D11_USAGE_DEFAULT;
  5. bd.ByteWidth = sizeof(ConstantBuffer);
  6. bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
  7. bd.CPUAccessFlags = 0;
  8. hr = device->CreateBuffer( &bd, NULL, &m_matrixBuffer );
  9. if( FAILED( hr ) )
  10. return hr;

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

当中bd.Usage属性  

  1. D3D11_USAGE_DEFAULT

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

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

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

  1. //
  2. // Update variables
  3. //
  4. ConstantBuffer cb;
  5. cb.mWorld = XMMatrixTranspose( worldMatrix);
  6. cb.mView = XMMatrixTranspose( viewMatrix );
  7. cb.mProjection = XMMatrixTranspose( projectionMatrix );
  8. deviceContext->UpdateSubresource( m_matrixBuffer, 0, NULL, &cb, 0, 0 );
  9. deviceContext->VSSetConstantBuffers( 0, 1, &m_matrixBuffer );

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

2:动态顶点缓冲区

和静态缓冲区不同。

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

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

  1. //create the light buffer
  2. ZeroMemory( &bd, sizeof(bd) );
  3. bd.Usage = D3D11_USAGE_DYNAMIC;
  4. bd.ByteWidth = sizeof(LightBuffer);
  5. bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
  6. bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  7. hr = device->CreateBuffer( &bd, NULL, &m_lightmaterialBuffer );
  8. if( FAILED( hr ) )
  9. return hr;
  10. return S_OK;

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

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

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

  1. D3D11_MAPPED_SUBRESOURCE mappedResource;
  2. ConstantBuffer *data0;
  3. LightBuffer *data1;
  4. //
  5. // Update variables
  6. //
  7. //ConstantBuffer cb;
  8. //cb.mWorld = XMMatrixTranspose( worldMatrix);
  9. //cb.mView = XMMatrixTranspose( viewMatrix );
  10. //cb.mProjection = XMMatrixTranspose( projectionMatrix );
  11. //锁定常量缓冲区
  12. HR(deviceContext->Map(m_matrixBuffer,0,D3D11_MAP_WRITE_DISCARD,0,&mappedResource));
  13. //deviceContext->UpdateSubresource( m_matrixBuffer, 0, NULL, &cb, 0, 0 );
  14. data0=(ConstantBuffer*)mappedResource.pData;
  15. data0->mWorld=XMMatrixTranspose( worldMatrix);
  16. data0->mView=XMMatrixTranspose( viewMatrix );
  17. data0->mProjection=XMMatrixTranspose( projectionMatrix );
  18. deviceContext->Unmap(m_matrixBuffer,0);
  19. deviceContext->VSSetConstantBuffers( 0, 1, &m_matrixBuffer );
  20. //LightBuffer lb;
  21. //lb.cameraPosition=cameraPos;
  22. //锁定光照缓冲区
  23. HR(deviceContext->Map(m_lightmaterialBuffer,0,D3D11_MAP_WRITE_DISCARD,0,&mappedResource));
  24. data1=(LightBuffer*)mappedResource.pData;
  25. data1->cameraPosition=cameraPos;
  26. deviceContext->Unmap(m_lightmaterialBuffer,0);
  27. //deviceContext->UpdateSubresource( m_lightmaterialBuffer, 0, NULL, &lb, 0, 0 );
  28. 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. delpi中的RTTI初试

    java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo: 1.先定义一 ...

  2. Thinkphp入门三—框架模板、变量(47)

    原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display()   调用当前操作名称的模板 display(‘名字’)  调用指定名字的模板文件 控制器调用模板四种方式 ...

  3. 开源力量公开课第三十期- 跟我一起玩转OpenStack

    开源力量公开课第三十期- 跟我一起玩转OpenStack 开课时间:2013年9月10日 18:30 - 21:30 形式:现场(北京3W咖啡) + 线上直播,   免费报名:http://www.o ...

  4. OCA读书笔记(1) - 浏览Oracle数据库架构

    Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...

  5. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  6. cocos2d-x lua 内存回收

    使用cocos2d-x lua架构,游戏中存在两种内存回收方式. 1.cocos2d-x 本身内存回收 PS:假设在lua在创建一个类,继承cocos2d-x的一个类A,则该A也遵循cocos2d-x ...

  7. 【Dev Club 分享】腾讯验证码的十二年

    源:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653578147&idx=3&sn=94a8f8f8b4a23 ...

  8. 14.6.1 Creating InnoDB Tables 创建InnoDB 表:

    14.6.1 Creating InnoDB Tables 创建InnoDB 表: 创建一个InnoDB 表,使用CREATE TABLE 语句,你不需要指定 ENGINE=InnoDB子句 如果In ...

  9. [置顶] dubbo管理控制台安装

    dubbo管理控制台开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能. 1.下载dubbo 地址:http://code.alibabatech.com/mvn ...

  10. FOJ 2170 花生的序列 dp

    题目链接:http://acm.fzu.edu.cn/problem.php? pid=2170 贴个baka爷的代码留念.. 数据出的有问题.输入的字符串长度不超过1000 #include< ...