今天,我的引擎的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 );
}
}
分享到:
相关推荐
d3dx9 d3dx10 的各个版本,游戏不能启动时,一定要下载这个 d3dx9_25 d3dx9_26 d3dx9_27 d3dx9_28 d3dx9_29 d3dx9_30 d3dx9_31 d3dx9_32 d3dx9_33 d3dx9_34 d3dx9_35 d3dx9_36 d3dx9_37 d3dx9_38 d3dx9_39 d3dx9_40 ...
dx修复工具,包含了dx9、dx10、dx11修复的功能 从网上搜罗到的绿色工具,亲测有效
dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件dx10 软件...
d3dx10_40.dll3
DX10龙书用的APP框架,帮助编写DX10代码。
一篇关于DX10刚出几何着色器时的报告,流水线图非常好!
xp用的dx10,用来在xp运行dx10游戏
d3dx10_43 dx缺少dll
详细说明了DX10的sprite怎么用,从纹理的载入到sprite类的使用都有讲到,nice啊!
让DX10运行在windows xp3下的一个补丁,俄罗斯出品
d3dx10_43.dll
DX10 3D游戏编程 龙书上第二部分实例代码,可以用来学习DX10代码的编写,经典。
国外的dx10破解版~~可用于xp平台安装
DX10_Source
通过模拟让XP拥有DX10
d3dx10_34.dll下载,用于游戏缺少问题
APR2007_d3dx10_33_x64
APR2007_d3dx10_33_x64.cab
复制到C:\Windows\System32 内
解决部分 应用程序无法正常启动0xc000007b问题,包含d3dx9_39.dll、d3dx9_40.dll、d3dx9_41.dll、d3dx9_42.dll、d3dx9_43.dll、xinput1_3.dll,