Моя цель - динамически передавать UV-координаты в вершинный шейдер GLSLES из моей программы на C ++.
Кажется, что OGRE может передавать только 8 различных наборов UV в шейдер (например, атрибуты uv0, uv1 ... uv7). И предполагается, что нам нужно жестко закодировать их внутри шейдера.
Я попытался обойти эту проблему, изменив VertexDeclarations в SubMesh (uvX стал uv0, поэтому нет необходимости изменять шейдеры), но есть и другие проблемы с таким решением - я не могу использовать одну и ту же Mesh для разных объектов.
Мой обходной путь:
void cEntityActor::setUVSetAsDefault(Ogre::SubEntity& entity, UInt uvSet)
{
auto* vertex_decl = entity.getSubMesh()->vertexData->vertexDeclaration;
auto& elements = vertex_decl->getElements();
int idx = 0;
int uv0_elem_idx = <find uv0 element index>;
int uvN_elem_idx = <find uvN element index>;
const Ogre::VertexElement* uv0 = <find uv0 element>;
const Ogre::VertexElement* uvN = <find uvN element>;
auto uv0_idx = uv0->getIndex();
auto uvN_idx = uvN->getIndex();
vertex_decl->modifyElement(uv0_elem_idx, uv0->getSource(), uv0->getOffset(), uv0->getType(), uv0->getSemantic(), uvN_idx);
vertex_decl->modifyElement(uvN_elem_idx, uvN->getSource(), uvN->getOffset(), uvN->getType(), uvN->getSemantic(), uv0_idx);
}
//shader
#version 100
attribute vec4 vertex;
attribute vec4 uv0;
uniform mat4 worldviewproj_matrix;
varying vec2 oTexcoord2_0;
void main( void )
{
gl_Position = worldviewproj_matrix * vertex;
oTexcoord2_0 = uv0.xy;
}
Также существует другой возможный обходной путь - перекомпилируйте шейдеры с требуемым набором УФ, но это займет время и ограничено 8 возможными наборами УФ.
Любой совет? Возможно, есть способ каким-то образом настроить исходный код движка OGRE и «перенаправить», например, uv1 в uv0, чтобы uv0 из шейдера фактически принимал значения из uv1.
Спасибо.