修改OGRE中的模型顶点色

来源:互联网 发布:js获取div的title 编辑:程序博客网 时间:2024/05/29 04:36

 我想修改模型的顶点。在以前DX的开发经历中, 锁定顶点缓冲后改顶点色是很容易的。但是在OGRE中,我却没有成功实现。

//设置模型的顶点色
void CD3DEffect::Fun_SetModeColor(DWORD vColor)
{

 if(mObjEnt)
 { 
  MeshPtr  tpMesh = mObjEnt->getMesh();
  tpMesh->setVertexBufferPolicy(HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY,true);
  //遍历对应的模型
  int  tSubEngityNum = tpMesh->getNumSubMeshes();
  for(int S = 0 ; S < tSubEngityNum ; S++)
  {
   //
   SubMesh* tpSubMesh = tpMesh->getSubMesh(S);

   //锁定顶点缓冲区
   VertexData* tVertexData = tpSubMesh->vertexData;
   //色彩
   size_t tSize3 = 0;
   size_t  tOffSet3 = 0;
   const Ogre::VertexElement* posElem3 = tVertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_DIFFUSE);
   if(posElem3)
   {
    tSize3 = posElem3->getSize();
    tOffSet3 = posElem3->getOffset();
   }
   else
   {
    ::MessageBox(NULL,"没有顶点色","提示",MB_OK);
    return;
   }

   HardwareVertexBufferSharedPtr dstHVBPos = tVertexData->vertexBufferBinding->getBuffer(posElem3->getSource()); 
   size_t SizeInBytes  = dstHVBPos->getSizeInBytes();
   size_t numVertices  = dstHVBPos->getNumVertices();
   size_t SizeVertices = dstHVBPos->getVertexSize();
   size_t VerticesCount= tVertexData->vertexCount;
   unsigned char* pVert = static_cast<unsigned char*>(dstHVBPos->lock(0, SizeInBytes , HardwareBuffer::HBL_DISCARD));
   float *dstDataPos ;
   //遍历所有顶点
   for(int i = 0 ; i < VerticesCount ; i++,  pVert += SizeVertices )
   {
    posElem3->baseVertexPointerToElement(pVert,&dstDataPos);

    RGBA tColor  = dstDataPos[0];

   //为了验证色彩,我先取得一下查看
    BYTE tRed = tColor >>24;
    BYTE tGreen = (tColor >>16)&0xff;
    BYTE tBlue = (tColor >>8)&0xff;
    BYTE tAlpha  = tColor &0xff;

    DWORD tRed2 = 255;
    DWORD tGreen2 = 255;
    DWORD tBlue2 = 0;
    DWORD tAlpha2 = 255;
    DWORD tColor2 =(tRed2 << 24)|(tGreen2 << 16)|(tBlue2 << 8)|tAlpha2 ;


    dstDataPos[0] = tColor2;

   }

   dstHVBPos->unlock();
  }

 }

 

我很迷茫,OGRE啊OGRE,你为何不让我修改它呢?为何修改顶点了完全不管用呢?

 

没办法,只好用shader来做了。虽然结果看起来是没问题,但我并没有成功的修改顶点的色彩。。。。。。。。

 

 if(false == mObjMaterial.isNull())
 {
  DWORD tRed = vColor&0xff;
  DWORD tGreen = (vColor >>8)&0xff;
  DWORD tBlue = (vColor>>16)&0xff;
  DWORD tAlpha  = 255;
  Vector4 myColor(float(tRed/255.0),float(tGreen/255.0),float(tBlue/255.0),1.0);
        SubEntity* sub = mObjEnt->getSubEntity(0);
  sub->setCustomParameter(1, myColor);

}

 

 

注:~

经群友skillzero指点。证实OGRE可以修改顶点色。需要做的是修改材质对应的PASS部分:

文档:手册:1-4-0:3.1.2 渲染通路(Pass)

ambient

设置此渲染通路中周围环境的反射系数。当asm,CG,HLSL(High Level Shader Language高级渲染语言)使用时,该属性无效。与GLSL()一起使用时,渲染器可以读OpenGL材质状态。

格式: ambient (<red> <green> <blue> [<alpha>]| vertexcolour)数值的取值范围在0.0到1.0之间。示例: ambient 0.0 0.8 0.0

渲染通路的基本颜色取决于各顶点红色,绿色和蓝色光的反射量。此属性决定了反射多少环境光(无目标的全局光)。也可以如在网格中定义的一样,通过使用关键字vertexcolour而不是使用颜色值,使环境反射系数跟踪顶点颜色。默认值是全白的,意思就是物体整个完全被照亮。如果你想要看见散射和镜面反射的效果,就要减少这个属性的相关数值,或者改变颜色的混合,使物体有一个不是白色的基础色。如果使用了'lighting off'属性将动态光照被关闭了或者任何纹理层有'colour_op replace'属性,那么“ambient”这个属性无效。

 

我忘记了~

 

diffuse vertexcolour
         specular vertexcolour
         ambient vertexcolour