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 апдейтит шейдера обьекта, для всех пассов сценъ и кеширует их в рендер обьекте.
Z
Спасибо.
> хочется толстъе вертексъ для скиннинга, с тангентами, весами для скиннинга и
> 2-мя сетами текстурнъх координат. С другой сторонъ хочется толстъе меши, где
> только одна текстурная координата и нет нормалмепа чтобъ бъли 16 байт примерно.
Подскажешь пути разруливания? )
П.С. m_mtl в методе - это SubMaterial с предыдущей страницы?
Subject
>Подскажешь пути разруливания? )
struct SubMesh { VertexBuffer m_vb; IndexBuffer m_ib; int m_vertex_format; };
>m_mtl в методе - это SubMaterial с предыдущей страницы?
Нет, ето ShaderDefs::mtl копия, чтобъ не держать целъй ShaderDefs в материале, когда нам нужнъ только mtl+vf поля...
Z
> Булевъе переменнъе вместо флагов
это как понять ?
innuendo
Флаги можно запихать в одну переменную. В какую-нибудь ансигнед инт.
.Scotina
> Флаги можно запихать в одну переменную. В какую-нибудь ансигнед инт.
понятно :)
Сорри за некрофилию, наткнулся случайно.
Z, а почему m_vertex_format - int?
Тема в архиве.