我目前正在使用 DirectX 进行渲染的 C++ 小游戏引擎项目。Model
引擎的渲染部分由和等类组成Texture
。因为我想让它(相对)简单地切换到另一个渲染库(例如 OpenGL)(并且因为我认为它只是很好的封装),我想让这些类的公共接口完全没有对 DirectX 的任何引用类型,即我想避免提供诸如ID3D11ShaderResourceView* GetTextureHandle();
.
然而,当诸如此类的类需要用于执行其任务Model
的内部纹理句柄时(例如在实际渲染模型时),这就会成为一个问题。Texture
为简单起见,让我们将 DirectX 替换为任意 3D 渲染库,我们将其称为 Lib3D。这是一个演示我面临的问题的示例:
class Texture {
private:
Lib3DTexture mTexture;
public:
Texture(std::string pFileName)
: mTexture(pFileName)
{
}
};
class Model {
private:
Texture* mTexture;
Lib3DModel mModel;
public:
Model(std::string pFileName, Texture* pTexture)
: mTexture(pTexture), mModel(pFileName)
{
}
void Render()
{
mModel.RenderWithTexture( /* how do I get the Lib3DTexture member from Texture? */ );
}
};
当然,我可以提供一个简单地返回指向 的指针的公共GetTextureHandle
函数,但这意味着如果我更改底层渲染库,我还必须更改该函数返回的类型,从而更改. 更糟糕的是,也许新库的结构甚至不同,这意味着我必须提供全新的功能!Texture
mTexture
Texture
我能想到的最好的解决方案是交Model
朋友,Texture
这样它就可以Texture
直接访问 的成员。然而,这似乎有点笨拙,因为我添加了更多使用Texture
. 我从来没有过多地使用友谊,所以我不确定这是否是一个可以接受的用例。
所以,我的问题是:
- 将 Model 声明为 Texture 的朋友是否可以接受友谊的使用?这会是一个很好的解决方案吗?
- 如果没有,你会推荐什么?我需要完全重新设计我的班级结构吗?在这种情况下,任何提示?
PS:我意识到标题不是很具有描述性,对此我深表歉意,但我真的不知道该怎么说。