服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

dx图形流程(基于mesh静态模型绘制----托管代码)


  mesh的得到一般使用mesh.fromfile方法。当然它有很多个重载。
  
  一般使用 public static mesh fromfile(string, meshflags, device, out extendedmaterial); 方法。要注意的是,mesh的读取要在初始d3d设备以后来作。在mesh的初始方法中都需要d3d设备为参数,以后的mesh绘制也使用此设备。
  
  对d3d设备的初始化中设置一般的显示属性,比如:深度测试,多重采样,灯光渲染开关,等等。
  
  presentparameters presentparams = new presentparameters();
  
  presentparams.windowed=true;
  
  presentparams.swapeffect = swapeffect.discard;
  
  presentparams.enableautodepthstencil=true;
  
  presentparams.autodepthstencilformat=depthformat.d16;
  
  presentparams.multisample=multisampletype.nonmaskable;
  
  mydev = new device(0, devicetype.hardware, this,createflags.hardwarevertexprocessing, presentparams);
  
  mydev.renderstate.multisampleantialias=true;
  
  mydev.renderstate.lighting=true;
  
  mydev.renderstate.cullmode=cull.none;
  
  mydev.renderstate.zbufferenable=true;
  
  mydev.renderstate.zbufferfunction=compare.lessequal;
  
  mydev.renderstate.zbufferwriteenable=true;
  
  mydev.renderstate.ambient=matercolor;
  
  
  presentparameters presentparams = new presentparameters();
  
  presentparams.windowed=true;
  
  presentparams.swapeffect = swapeffect.discard;
  
  presentparams.enableautodepthstencil=true;
  
  presentparams.autodepthstencilformat=depthformat.d16;
  
  presentparams.multisample=multisampletype.nonmaskable;
  
  mydev = new device(0, devicetype.hardware, this,createflags.hardwarevertexprocessing, presentparams);
  
  mydev.renderstate.multisampleantialias=true;
  
  mydev.renderstate.lighting=true;
  
  mydev.renderstate.cullmode=cull.none;
  
  mydev.renderstate.zbufferenable=true;
  
  mydev.renderstate.zbufferfunction=compare.lessequal;
  
  mydev.renderstate.zbufferwriteenable=true;
  
  mydev.renderstate.ambient=matercolor;
  
  
  对于灯光的设置,可以根据需要放在每侦渲染函数内调整,也可以把固定灯光放在绘制之前。
  
  
  一般绘制一个mesh时候,其中每个模型块都采用相同的世界矩阵。在绘制mesh之前设置好worldmatrix即可。有时一个场景内mesh太多,而有些mesh共同组成一个物体时,对于每个mesh调整worldmatrix可能会非常麻烦。所以最好是按照对应相对坐标调整好这些mesh的坐标,之后对这一组mesh采用同样的worldmatrix。在修改mesh顶点数据之前,先使用mesh.clone复制出一个自己控制顶点数据格式的mesh。
  
  public mesh clone(meshflags, vertexformats, device);
  
  根据你需要的 vertexformats格式,便可以容易的遍历修改顶点数据。当然,在修改前不要忘记lock你要修改的数据流。
  
  
  对于mesh里包含的材质和纹理,需要你手动来调整。在mesh的fromfile中,已经out出了一个包含纹理的材质组extendedmaterial。
  
  我们要声明一个材质组,一个纹理组。
  
  texture[] meshtextures = new texture[materials.length];
  
  material[] meshmaterials = new direct3d.material[materials.length];
  
  之后分离材质和纹理。
  
  for( int i=0; i  
  {
  
  meshmaterials[i] = materials[i].material3d;
  
  // set the ambient color for the material. direct3d
  
  // does not do this by default.
  
  meshmaterials[i].ambient = meshmaterials[i].diffuse;
  
  // create the texture.
  
  meshtextures[i] = textureloader.fromfile(dev,materials[i].texturefilename);
  
  }
  
  
  
  现在我们可以绘制mesh了。
  
  for( int i=0; i  
  {
  
  // set the material and texture for this subset.
  
  device.material = meshmaterials[i];
  
  device.settexture(0, meshtextures[i]);
  
  
  // draw the mesh subset.
  
  mesh.drawsubset(i);
  
  }
  
  最后别忘记device.endscene();device.present();
  
  
  在上边d3d设备初始的时候,我们启动了趁度测试,所以,在绘制每侦前,调用clear函数时,一并要清理深度缓冲,否则绘制会一踏糊涂。
  
  dx图形流程(基于mesh静态模型绘制----托管代码)
  
  以上是基本mesh静态模型绘制。对于其他高级效果的绘制,以后再写。

扫描关注微信公众号