图形学 Direct3D的3D模型处理1
用A[n]代表Attibute Buffer, 那么三角形0属于子网0,其Attribute Buffer号为0,即A[0],三角形1属于子网4,因为A[1]=4……三角形n属于子网2,A[n]=2;
Attibut Buffer同样可以锁定读取的:
DWORD* buffer = 0;Mesh->LockAttributeBuffer(lockingFlags, &buffer); // Read or write to attribute buffer...Mesh->UnlockAttributeBuffer();
下面看看如何在Direct3D中画模型
DrawSubset就是个画三角形几何图形的函数,可以带一个参数,这个参数为子网号。
Mesh->DrawSubset(0);//画子网号为0的所有三角形
所以我们可以用一个简单的循环就把所有模型都画出来。下面是个例子,而且每个子网都有自己的材质和纹理。
HR(mFX->BeginPass(0));for(int j = 0; j < mMtrl.size(); ++j){ HR(mFX->SetValue(mhMtrl, &mMtrl[j], sizeof (Mtrl))); if(mTex[j] != 0) { HR(mFX->SetTexture(mhTex, mTex[j])); } else { HR(mFX->SetTexture(mhTex, mWhiteTex)); } HR(mFX->CommitChanges()); HR(mMesh->DrawSubset(j));}HR(mFX->EndPass());
如果子网没有纹理的话,我们就把纹理设置为纯白色。因为材质颜色和光照颜色是作与运算的,所以白色值相当于1,1与任何数作与运算都等于任何数,也就是说没有纹理颜色的物体等于光照颜色。
// Combine the color from lighting with the texture color.float3 color = (ambient + diffuse)*texColor.rgb + spec;