`
yidongkaifa
  • 浏览: 4051629 次
文章分类
社区版块
存档分类
最新评论

修改OGRE中的模型顶点色

 
阅读更多

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

//设置模型的顶点色
voidCD3DEffect::Fun_SetModeColor(DWORDvColor)
{

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

//锁定顶点缓冲区
VertexData*tVertexData = tpSubMesh->vertexData;
//色彩
size_ttSize3 = 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;
}

HardwareVertexBufferSharedPtrdstHVBPos = 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);

RGBAtColor = dstDataPos[0];

//为了验证色彩,我先取得一下查看
BYTEtRed= tColor >>24;
BYTEtGreen= (tColor >>16)&0xff;
BYTEtBlue= (tColor >>8)&0xff;
BYTEtAlpha = tColor &0xff;

DWORDtRed2= 255;
DWORDtGreen2= 255;
DWORDtBlue2= 0;
DWORDtAlpha2 = 255;
DWORDtColor2 =(tRed2 << 24)|(tGreen2 << 16)|(tBlue2 << 8)|tAlpha2 ;


dstDataPos[0] = tColor2;

}

dstHVBPos->unlock();
}

}

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

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

if(false == mObjMaterial.isNull())
{
DWORDtRed= vColor&0xff;
DWORDtGreen= (vColor >>8)&0xff;
DWORDtBlue= (vColor>>16)&0xff;
DWORDtAlpha = 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics