我正在编写游戏引擎并无法解决正确的方法。 我会举例说明一个材料类。
第一种方式:
class Material {
public:
void Bind(); // bind all that can: uniforms, textures, vertex shader, fragment shader, etc
};
// somewhere in scene manager
...
material.Bind();
// below is binding all params and resources that material require from outside
if (material.IsRequireWVP()) glUniform(...);
if (material.IsRequireModelTexture()) glBindTexture(...);
...
第二种方式:
class Material {
public:
TexGLES2Ref GetTexture();
VSGLES2Ref GetVertexShader();
string GetUniformName();
value getUniformValue();
// etc
};
// somewhere in scene manager
...
// bind all resources that material need here
// material has no bind method
glUniform(material->get(....), material->get(...));
if (material.IsRequireWVP()) glUniform(...);
if (material.IsRequireModelTexture()) glBindTexture(...);
...
因为“书不能自己读”我用第二种方式,
但这种方式比第一种方式更不舒服,因为如果我需要绑定来自许多代码位置的材料,那么我必须编写大量代码,因为材料有通过,制服,纹理等,这就是“循环周期循环”。我想象的第一个解决方案是像BindMaterial(Material *material);
这样的写函数。在这种情况下,“本书不会自己阅读”。
但是我看到很多代码都是第一种方式,并且认为必须有一些使用第一种情况的论据。也许编码员只是拒绝“书不能自己阅读”并使用对他们来说更舒服的方式?
哪种方式更好,更正确?
您使用什么方式?为什么?