在架构上纠正纹理/着色器/材质/ VB / IB绑定本身?

时间:2015-04-03 11:19:20

标签: architecture game-engine material

我正在编写游戏引擎并无法解决正确的方法。 我会举例说明一个材料类。

第一种方式:

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);这样的写函数。在这种情况下,“本书不会自己阅读”。

但是我看到很多代码都是第一种方式,并且认为必须有一些使用第一种情况的论据。也许编码员只是拒绝“书不能自己阅读”并使用对他们来说更舒服的方式?

哪种方式更好,更正确?

您使用什么方式?为什么?

0 个答案:

没有答案