我的目标是从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中获取值。
谢谢。