Войти
ПрограммированиеФорумОбщее

Движок Cafu (Ca3D) теперь GPLv3 (комментарии) (2 стр)

Страницы: 1 2
#15
19:53, 12 фев. 2010

Subject
> Просто формат предоставления геометрии.
Ну, ето немного несериозно тогда - хочется толстъе вертексъ для скиннинга, с тангентами, весами для скиннинга и 2-мя сетами текстурнъх координат. С другой сторонъ хочется толстъе меши, где только одна текстурная координата и нет нормалмепа чтобъ бъли 16 байт примерно.
Етот меш ничего такого делать не умеет. В топку такое щастье... :)

>А расскажи плиз про ShaderDefs и GetShader( PassType pass ).
Ну, примерно, вот ето полная инфа для генерации убер-шейдера:

struct ShaderDefs
{
  uint32 mtl;  // material properties - diffuse map, normal map, gloss map, emissive map, env map, eye specular, rim, blending, ...
  uint16 vf;    // vertex format, instancing type, 
  uint16 hw;  // hardware specific flags
  uint16 dyn; // dynamic flags - fog, lighting, dithering, etc.
};
Из всего етого в материале нужно хранить только mtl и пожалуй vf.

Shader * Material::GetShader( PassType pass, uint16 dynamic_flags )
{
  // 0 pass - forward rendering, 1 pass - shadow, ...
  static const uint32 mtl_pass_mask[] = { ~0, ~(emNormalMap|emGlossMap|emEmissiveMap|emRim|..), ..};
  static const uint32 dyn_pass_mask[] = { ~0, ~(edLightMask|edFogOnly|...), ... };

  ShaderDefs sdef;
  sdef.mtl = m_mtl & mtl_pass_mask[pass];  // remove all not essential material properties for that pass - i.e. nobody cares about normal map in the Shadow pass
  sdef.vf = m_vf;
  sdef.hw = s_current_hw;
  sdef.pass = pass;
  sdef.dyn = dynamic_flags & dyn_pass_mask[pass];  // remove all non-essential dynamic properties for that pass
  MyString shader_file = g_pShaderLib->GetShaderFile( m_shader_name, pass );  // see what shader filename coresponds to that shader ref and pass type
  return g_pShaderCache->GetShader( shader_file, sdef );
}

И соответно, в обходе сцен графа где апдейт обьектов - есть обсчет dynamic_flags для каждого обьекта и если он изменился - вот тот GetShader апдейтит шейдера обьекта, для всех пассов сценъ и кеширует их в рендер обьекте.

#16
20:06, 12 фев. 2010

Z
Спасибо.

> хочется толстъе вертексъ для скиннинга, с тангентами, весами для скиннинга и
> 2-мя сетами текстурнъх координат. С другой сторонъ хочется толстъе меши, где
> только одна текстурная координата и нет нормалмепа чтобъ бъли 16 байт примерно.
Подскажешь пути разруливания? )

П.С. m_mtl в методе - это SubMaterial с предыдущей страницы?

#17
20:28, 12 фев. 2010

Subject
>Подскажешь пути разруливания? )

struct SubMesh
{
  VertexBuffer m_vb;
  IndexBuffer  m_ib;
  int m_vertex_format;
};

>m_mtl в методе - это SubMaterial с предыдущей страницы?
Нет, ето ShaderDefs::mtl копия, чтобъ не держать целъй ShaderDefs в материале, когда нам нужнъ только mtl+vf поля...

#18
21:25, 12 фев. 2010

Z
> Булевъе переменнъе вместо флагов
это как понять ?

#19
21:41, 12 фев. 2010

innuendo

Флаги можно запихать в одну переменную. В какую-нибудь ансигнед инт.

#20
21:52, 12 фев. 2010

.Scotina
> Флаги можно запихать в одну переменную. В какую-нибудь ансигнед инт.
понятно :)

Прошло более 6 месяцев
#21
4:14, 8 сен. 2010

Сорри за некрофилию, наткнулся случайно.
Z, а почему m_vertex_format - int?

Страницы: 1 2
ПрограммированиеФорумОбщее

Тема в архиве.