题
目前,我的应用程序的使用只是Direct3D9图形,但是在未来I'm计划扩展到D3D10和可能的照片.问题是我怎么可以这样做于一个整洁的方式?
目前有各种呈现的方法,在我的代码
void Render(boost::function<void()> &Call)
{
D3dDevice->BeginScene();
Call();
D3dDevice->EndScene();
D3dDevice->Present(0,0,0,0);
}
该函传递然取决于确切的国家,例如菜单->呈现,载->渲染,等等。这些会然后往往需呼叫的方法的其他对象。
void RenderGame()
{
for(entity::iterator it = entity::instances.begin();it != entity::instance.end(); ++it)
(*it)->Render();
UI->Render();
}
和一个样本类中衍生的实体::基
class Sprite: public Base
{
IDirect3DTexture9 *Tex;
Point2 Pos;
Size2 Size;
public:
Sprite(IDirect3DTexture9 *Tex, const Point2 &Pos, const Size2 &Size);
virtual void Render();
};
每一种方法则需要护理的如何最好地呈现给予更详细的设置(例如正像素寄支持或不)。
问题是我真的不知道该如何扩大这种能够使用的一个,怎么可能会有所不同(D3D v载)呈现的模式...
解决方案
定义一个界面,足够用于应用程序的图形输出的要求。然后实施这一界面为每个渲染你想要的支持。
class IRenderer {
public:
virtual ~IRenderer() {}
virtual void RenderModel(CModel* model) = 0;
virtual void DrawScreenQuad(int x1, int y1, int x2, int y2) = 0;
// ...etc...
};
class COpenGLRenderer : public IRenderer {
public:
virtual void RenderModel(CModel* model) {
// render model using OpenGL
}
virtual void DrawScreenQuad(int x1, int y1, int x2, int y2) {
// draw screen aligned quad using OpenGL
}
};
class CDirect3DRenderer : public IRenderer {
// similar, but render using Direct3D
};
适当地设计和维持这些接口的可能非常具有挑战性的。
在你工作也呈现的驱动程序依赖对象样的纹理,可以用工厂的模式到具有独立提炼的每一个创造自己的实施,例如ITexture使用工厂的方法在IRenderer:
class IRenderer {
//...
virtual ITexture* CreateTexture(const char* filename) = 0;
//...
};
class COpenGLRenderer : public IRenderer {
//...
virtual ITexture* CreateTexture(const char* filename) {
// COpenGLTexture is the OpenGL specific ITexture implementation
return new COpenGLTexture(filename);
}
//...
};
是不是一个想法看看现在的(3d)引擎吗?以我的经验,设计这种接口很分散什么你实际上想要做的:)
其他提示
我想说如果你想要一个真正完整的答案,去看看源代码 Ogre3D
.他们有两个 D3D
和 OpenGL
后结束。看看: http://www.ogre3d.org
基本上他们的API种部队的你的工作在一个D3D上下的方式,创造缓冲的对象,并填塞他们的数据,然后发放画的呼吁,这些缓冲区。就是这样的硬件喜欢它,无论如何,所以它不是一个糟糕的路要走。
然后一旦你看到他们是如何做的事情,你可能也仅仅只是继续前进和使用和保存自己的麻烦有重新实现所有,它已经提供的。:-)
不隶属于 StackOverflow