为Direct3D 9 Mesh生成法线

时间:2014-10-28 17:13:44

标签: c++ directx direct3d mesh normals

我已经知道这可能通过使用D3DXComputeNormals()方法,但我无法弄清楚如何正确使用它。这样做没有任何教程或课程。有人可以给我解释或提供有用的代码吗?

2 个答案:

答案 0 :(得分:0)

你是什么意思,"正确"?你在寻找计算邻接的教程吗?如果没有,MSDN文档很好地说明here,为pAdjacency参数传递NULL。

答案 1 :(得分:0)

DirectXMesh库可以生成您可以用于任何版本的Direct3D的法线。

std::unique_ptr<WaveFrontReader<uint16_t>> mesh( new WaveFrontReader<uint16_t>() );

if ( FAILED( mesh->Load( L"test.obj" ) ) )
   // Error

if ( mesh->hasNormals )
   // Skip next computation

size_t nFaces = mesh->indices.size() / 3;
size_t nVerts = mesh->vertices.size();

std::unique_ptr<XMFLOAT3[]> pos( new XMFLOAT3[ nVerts ] );
for( size_t j = 0; j < nVerts; ++j )
   pos.get()[ j ] = mesh->vertices[ j ].position;

std::unique_ptr<XMFLOAT3[]> normals( new XMFLOAT3[ nVerts ] );
if ( FAILED( ComputeNormals( &mesh->indices.front(), nFaces,
   pos.get(), nVerts, CNORM_DEFAULT, normals.get() ) ) )
   // Error

库和源代码在CodePlex上,因此您可以随时进入它以查看它正在做什么,并且它可以替代已弃用的D3DX库。