DX9中如何模拟DX10/11里的ConstantBuffer
今天,我的引擎的DX9 RenderApi插件终于可以跑起来了。虽然问题还很多。不过总算看到图像了。立碑纪念一下。
一开始基于DX10的API来构造整个渲染系统的。DX10的API带来很多新的概念设计。比如Constant Buffer的概念,能统一Shader Constant的管理,当然在DX10/DX11里能有效的提高参数传递的效率。
比如:我做了个TransformBuffer。这个Buffer绑定掉了所有的Matrix上。当Camera变化,或者Matrix变化得时候,我只需要加个标记。下次使用这个Buffer的时候,我检查这个Dirty标记。如果Dirty了。那就下载数据到GPU Constant Buffer中。这样的好处就不会所有的Shader都需要download一遍相同的数据到GPU中了。严重节省了GPU-CPU数据交换的时间。
但是杯具的是,DX9中没这个东西。
不过虽然没有。我至少在行为上可以模拟的像一点。顶多不需要那严重节省下来的时间而已。
DX9的ConstantTable里。可以检查一个Constant是不是Struct。 如果是一个Struct,那么它的数据都是连续的。我们可以用Struct来模拟Constant Buffer。
比如:
struct cTransformBuffer
{
matrix matWorld;
matrix matView;
matrix matProject;
float4 cameraUp;
float4 cameraPos;
float4 cameraDir;
float4 cameraArg;//[Near , Far , Fov , Aspect]
};
cTransformBuffer TransformBuffer;
我就有了一个名字为TransformBuffer的Struct。而且这个Struct的大小,和总的D3DXHANDLE在ConstantTable里是都可以拿的到得。
在我们需要数据的时候,用pConstantTable->SetValue()函数,把整块数据扔给ShaderConstantTable就Ok了。
虽然这样没有节省任何CPU-GPU时间。不过代码变的真是干净彻底啊。
PS: 同理把渲染状态进行管理。按照DX11/DX10的分类。然后成组的设置。管理渲染状态也变得更加方便了。
代码如下,自带渲染状态重复判断。不会多设置一个不需要设置的多余的渲染状态。
void xD3D9ZStencilState::Install(xD3D9ZStencilState* pOldStencil)
{
IDirect3DDevice9* pDevice = m_pD3D9RenderApi->getDevice();
if(pOldStencil)
{
GUID_VALUE(m_Stencil.m_Enable ) pDevice->SetRenderState(D3DRS_STENCILENABLE , m_Stencil.m_Enable );
GUID_VALUE(m_Stencil.m_Ref ) pDevice->SetRenderState(D3DRS_STENCILREF , m_Stencil.m_Ref );
GUID_VALUE(m_Stencil.m_Mask ) pDevice->SetRenderState(D3DRS_STENCILMASK , m_Stencil.m_Mask );
GUID_VALUE(m_Stencil.m_WriteMask) pDevice->SetRenderState(D3DRS_STENCILWRITEMASK , m_Stencil.m_WriteMask);
GUID_VALUE(m_Stencil.m_OpCW.m_Fail ) pDevice->SetRenderState(D3DRS_STENCILFAIL , m_Stencil.m_OpCW.m_Fail );
GUID_VALUE(m_Stencil.m_OpCW.m_zFail) pDevice->SetRenderState(D3DRS_STENCILZFAIL , m_Stencil.m_OpCW.m_zFail);
GUID_VALUE(m_Stencil.m_OpCW.m_Pass ) pDevice->SetRenderState(D3DRS_STENCILPASS , m_Stencil.m_OpCW.m_Pass );
GUID_VALUE(m_Stencil.m_OpCW.m_Func ) pDevice->SetRenderState(D3DRS_STENCILFUNC , m_Stencil.m_OpCW.m_Func );
GUID_VALUE(m_Stencil.m_OpCCW.m_Fail ) pDevice->SetRenderState(D3DRS_CCW_STENCILFAIL , m_Stencil.m_OpCCW.m_Fail );
GUID_VALUE(m_Stencil.m_OpCCW.m_zFail) pDevice->SetRenderState(D3DRS_CCW_STENCILZFAIL , m_Stencil.m_OpCCW.m_zFail);
GUID_VALUE(m_Stencil.m_OpCCW.m_Pass ) pDevice->SetRenderState(D3DRS_CCW_STENCILPASS , m_Stencil.m_OpCCW.m_Pass );
GUID_VALUE(m_Stencil.m_OpCCW.m_Func ) pDevice->SetRenderState(D3DRS_CCW_STENCILFUNC , m_Stencil.m_OpCCW.m_Func );
}
else
{
pDevice->SetRenderState(D3DRS_STENCILENABLE , m_Stencil.m_Enable );
pDevice->SetRenderState(D3DRS_STENCILREF , m_Stencil.m_Ref );
pDevice->SetRenderState(D3DRS_STENCILMASK , m_Stencil.m_Mask );
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK , m_Stencil.m_WriteMask);
pDevice->SetRenderState(D3DRS_STENCILFAIL , m_Stencil.m_OpCW.m_Fail );
pDevice->SetRenderState(D3DRS_STENCILZFAIL , m_Stencil.m_OpCW.m_zFail);
pDevice->SetRenderState(D3DRS_STENCILPASS , m_Stencil.m_OpCW.m_Pass );
pDevice->SetRenderState(D3DRS_STENCILFUNC , m_Stencil.m_OpCW.m_Func );
pDevice->SetRenderState(D3DRS_CCW_STENCILFAIL , m_Stencil.m_OpCCW.m_Fail );
pDevice->SetRenderState(D3DRS_CCW_STENCILZFAIL , m_Stencil.m_OpCCW.m_zFail);
pDevice->SetRenderState(D3DRS_CCW_STENCILPASS , m_Stencil.m_OpCCW.m_Pass );
pDevice->SetRenderState(D3DRS_CCW_STENCILFUNC , m_Stencil.m_OpCCW.m_Func );
}
}
DX9中如何模拟DX10/11里的ConstantBuffer相关推荐
- Scrapy框架的学习(10.Scrapy中的模拟登陆(使用cookie模拟登陆))
1. 为什么需要模拟登陆? 获取cookie,能够爬取登陆后的页面的数据 2.使用cookie模拟登陆的场景 (1) cookie过期时间很长,常见于一些不规范的网站 (2) 能在cookie过期之前 ...
- C语言模拟11答案,C语言模拟试题11答案.doc
C语言模拟试题11答案.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...
- 利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图。 标签: ECharts3Echarts2模拟迁徙百度地图引入
利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图. 很多小伙伴都来要demo源码,现在我把demo放在我的GitHub上了. https://github.com/ ...
- oracle取括号内数字,怎么把excel中一列文本中括号里的数字弄出来啊
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:怎么把excel中一列文本中括号里的数字弄出来啊回答:=MID(A1,FIND("(",A1)+1,FIND(")",A1)-FIN ...
- 飞桨常规赛:PALM眼底彩照中黄斑中央凹定位-11月第1名方案
飞桨常规赛:PALM眼底彩照中黄斑中央凹定位-11月第1名方案 (1)比赛介绍 赛题介绍 榜首个人主页,戳此处查看 PALM黄斑定位常规赛的重点是研究和发展与患者眼底照片黄斑结构定位相关的算法.该常规 ...
- SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合
服务器运维与网站架构|Linux运维|X研究 let's face reality,loyalty to an ideal! 首页 Linux Nginx Security Shell 服务器架构 互 ...
- 备战Noip2018模拟赛11(B组)T4 Path 好路线
10月27日备战Noip2018模拟赛11(B组) T4路径好路线 题目描述 nodgd在旅游.现在,nodgd要从城市的西北角走到东南角去.这个城市的道路并不平坦,nodgd希望找出一条相对比较好走 ...
- 利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图。 标签: ECharts3Echarts2模拟迁徙百度地图引入 2016-10-24 16:21 10065人阅
利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图. 标签: ECharts3Echarts2模拟迁徙百度地图引入 2016-10-24 16:21 10065人阅 ...
- 在VC中实现模拟键盘,输入内容并显示在ListBox中。
网上找的,还没试过,希望对楼主有帮助 模拟键盘按键 自动输入文字 键盘对于每个操作电脑的人员来说是最熟悉不过的了.键盘上的按键可分为两类: 按下后会在电脑的输入窗口上出现对应字符的按键,如字母键和数字 ...
最新文章
- AI药物全球100领军人物:43%来自学界 美英顶级AI专家人数最多
- Typecho双栏博客免费主题—Splity
- 支付宝区块链授权专利212件 位居全球第一!
- qt connect函数_Qt 串口上位机开发Rice 上位机 学习开发
- 简述静态全局变量的概念 C++
- 【学习笔记】离散数学(Discrete Math) - 证明 Proof 3
- StarRocks 社区一周年:极速统一,感谢遇见!
- 软件开发各种版本规范
- 北京央企住房公积金查询网址
- Caché 时间函数
- 数模学习(模糊数学篇)——模糊识别(python实现)
- 计算机科学与技术专业实践范文,计算机科学与技术专业毕业实习报告范文.docx...
- MATLAB中cla函数
- 钉短信、钉电话收费套餐
- 嵌入式C设计模式---模板方法设计模式
- TCP在广域网相互通信
- 物联网 期末复习习题(特别全(第二篇))
- 初学ISE 半加器仿真 VHDL
- OpenStack之Neutron理论部分
- 智慧工地指挥室大屏显示系统应该如何建设?