我想修改模型的顶点。在以前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
分享到:
相关推荐
ogre 光照 模型
ogre模型查看器OgreMeshy.1.3
ogre中文教程
ogre的.mesh文件的查看工具,可以方便的查看模型,动画等
3D MESH格式 大场景模型 可用于OGRE场景调试
ogre骨骼动画模型,是一个忍者的骨骼动画!
ogre模型混合工具meshmixer ogre模型混合工具meshmixer
最新 OGRE 中文 帮助 文档 chm
OGRE中文帮助手册整理,从OGRE中文网站上考下来的文章,整理编排下做成PDF以供学习参考
ogre中文帮助手册使你更快速的学习和掌握,帮助手册中详细的介绍通俗易懂,学习人员方便掌握之至宝,这个是中文版的,方便国内程序人员查阅
Ogre中使用CEGUI
Ogre 3D引擎的具体介绍. Pro OGRE 3D Programming 中文翻译版本0.2.0 原作者:Gregory Juker 译 者:邸锐(免费打工仔) 李旭东
OGRE中文帮助手册: 将网上的chm转成pdf,希望有用, 无标签
ogre中的材质脚本 渲染通道处已经进行了一次整体的渲染环境设置
这个是原来ogre中文社区的基础教程 最近被封了 上传下大家分享
在OGRE中使用HLSL.txt在OGRE中使用HLSL.txt在OGRE中使用HLSL.txt
ogre中渲染3D字体ogre中渲染3D字体
两本书还是不错的,ogre基础教程帮助文档,对初学者比较有帮助
根据Face.mesh.xml改写的模型,可以比较清晰的看到Ogre的mesh格式,附有简单注释。
不说了,这个是网上搜集的中文和英文的合成,我觉得他们的英文写的还是可读性很轻强的啊