OGRE:如何将UV集传递到顶点着色器中

时间:2019-05-04 11:18:17

标签: shader game-engine ogre glsles uv-mapping

我的目标是从C ++程序动态将UV坐标传递到GLSLES顶点着色器中。

似乎OGRE只能将8个不同的UV集传递到着色器(如uv0,uv1 ... uv7属性)。并且假定我们需要在着色器中对其进行硬编码。

我试图通过修改SubMesh中的VertexDeclarations解决此问题(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;
}

还有另一种可能的解决方法-使用所需的UV集重新编译着色器,但是这将花费时间,并且受8种可能的UV集的限制。

有什么建议吗?也许有一种方法可以将OGRE引擎源代码和“重定向”(例如uv1)调整为uv0,以便来自着色器的uv0实际上会从uv1中获取值。

谢谢。

0 个答案:

没有答案