Огре: как я могу передать УФ набор в вершинный шейдер - PullRequest
0 голосов
/ 04 мая 2019

Моя цель - динамически передавать 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.

Спасибо.

...