|
昨天通过FBX的官方例题写了一个简单的读取顶点坐标的小程序,今天完成昨天没有完成的两件事:读取三角形索引缓冲区和顶点色。
box
效果如上图所示。昨天绘制的红色Box的顶点色是手动写在程序里的,无论在3DsMax 做的什么颜色的Box在程序里都是红的。今天的程序可以让Box在3DsMax存成什么颜色,就绘制什么颜色。需要强调的一下是昨天的模型无法获取顶点色问题在模型上。主要是不会用3DsMax,误以为染成红色就是顶点色是红的。其实在3DsMaX里染顶点色还颇费一番周折。02例题里加入新的模型,采用了红黄两种颜色。在这里又发现了新的问题,在3DsMax中设定的颜色和显示是来的位置不同,这样又回到了上一个例题中的一个问题,即发现绘制出来的模型位置不准确。到02例题可以肯定的是我们可以读取颜色信息和位置信息,但是会和3DsMax的位置不一样。
本例题完整代码下载:
http://kuai.xunlei.com/d/SDFEIFHOUQLO备用地址:
金山快盘附件:FBX_Samples02.zip(3.16MB)
在新的例题中只增加了一个函数:void GetPolygonsInfo(FbxMesh* pMesh)解决了颜色读取,顺便解决了indexbuffer。- void CFBXLoader::GetPolygonsInfo(FbxMesh* pMesh)
- {
- //获取多边形数量
- int lPolygonCount = pMesh->GetPolygonCount();
- FbxVector4* lControlPoints = pMesh->GetControlPoints();
- int vertexId = 0;
- //遍历每一个多边形
- for (int i = 0; i < lPolygonCount; i++)
- {
- //每一个多边形有几个点组成
- int lPolygonSize = pMesh->GetPolygonSize(i);
- for (int j = 0; j < lPolygonSize; j++)
- {
- int lControlPointIndex = pMesh->GetPolygonVertex(i, j);
- iBuffer[3*i+j] = lControlPointIndex;
- for (int l = 0; l < pMesh->GetElementVertexColorCount(); l++)
- {
- FbxGeometryElementVertexColor* leVtxc = pMesh->GetElementVertexColor( l);
- switch (leVtxc->GetMappingMode())
- {
- case FbxGeometryElement::eByControlPoint:
- switch (leVtxc->GetReferenceMode())
- {
- case FbxGeometryElement::eDirect:
- break;
- case FbxGeometryElement::eIndexToDirect:
- {
- int id = leVtxc->GetIndexArray().GetAt(lControlPointIndex);
- }
- break;
- default:
- break; // other reference modes not shown here!
- }
- break;
- case FbxGeometryElement::eByPolygonVertex:
- {
- switch (leVtxc->GetReferenceMode())
- {
- case FbxGeometryElement::eDirect:
- break;
- case FbxGeometryElement::eIndexToDirect:
- {
- int id = leVtxc->GetIndexArray().GetAt(vertexId);
- FbxColor vColor = leVtxc->GetDirectArray().GetAt(id);
- vBuffer[lControlPointIndex].color = D3DCOLOR_COLORVALUE(vColor.mRed,vColor.mGreen,vColor.mBlue,vColor.mAlpha);
- }
- break;
- default:
- break; // other reference modes not shown here!
- }
- }
- break;
- case FbxGeometryElement::eByPolygon: // doesn't make much sense for UVs
- case FbxGeometryElement::eAllSame: // doesn't make much sense for UVs
- case FbxGeometryElement::eNone: // doesn't make much sense for UVs
- break;
- }
- }
- vertexId++;
- }
- }
复制代码 这个代码里有几个地方需要关注一下:
获取每个三角形的索引:虽然这里解决了索引缓冲,但是觉得这并不是最佳的方法,所以帖子的标题中未提及索引缓冲,若果找到了更好的办法,会专门写个帖子介绍用法。- //当前三角形是由哪三个点组成的
- int lControlPointIndex = pMesh->GetPolygonVertex(i, j);
- iBuffer[3*i+j] = lControlPointIndex;
复制代码 颜色的获取:下面这行代码的地方是颜色的获取,代码循环较长这里简单介绍一下:- int id = leVtxc->GetIndexArray().GetAt(vertexId);
- FbxColor vColor = leVtxc->GetDirectArray().GetAt(id);
- vBuffer[lControlPointIndex].color = D3DCOLOR_COLORVALUE(vColor.mRed,vColor.mGreen,vColor.mBlue,vColor.mAlpha);
复制代码 pMesh->GetElementVertexColorCount()还没搞清楚到底起什么作用。但是如果模型中包含了颜色信息,这个地方就不为0.
通过索引vertexId就可以获取当前顶点id , leVtxc->GetIndexArray().GetAt(vertexId);
vColor = leVtxc->GetDirectArray().GetAt(id); 通过顶点id 获取当前顶点颜色。
这段代码里需要提及的是,作为FBX文件,并不保证组成的模型全部是三角形组成的。因此我们要判断。
|
|