2012-04-13 78 views
4

我遇到了一個對我來說似乎是個bug的問題。我正在製作一個應用程序,用於顯示水晶中的原子。這個問題是它繪製了一個透明的對象並隱藏了對象。帶有DiffuseMaterial的ModelVisual3D的透明度

enter image description here

下面是代碼:

 foreach (var atom in filteredAtoms) 
     { 
      var color = new Color(); 

      color.ScR = (float)atom.AluminiumProbability; 
      //color.G = 50; 
      color.ScB = (float)atom.MagnesiumProbability; 
      //setting alpha channel but Opacity doens't work as well 
      color.ScA = (float)(1.0 - atom.VacancyProbability); //(float)1.0;// 
      DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(color)); 
      //material.Brush.Opacity = 1.0 - atom.VacancyProbability; 

      // make visuals and add them to 
      atomBuldier.Add(new Point3D(atom.X * Atom.ToAngstrom, atom.Y * Atom.ToAngstrom, atom.Z * Atom.ToAngstrom), material); 
     } 

當我改變的材料例如EmissiveMaterial沒有「剪切」原子。我搜索了this post,但給出的建議不適用於這種情況。

這是2D刷子應用於3D的錯誤嗎?

完整的源代碼可以在這裏找到http://alloysvisualisation.codeplex.com該DLL和一個測試文件http://alloysvisualisation.codeplex.com/releases beta鏈接。

重現步驟:

  1. 午餐應用
  2. 點擊打開文件按鈕
  3. 打開測試文件(xyzT2000.chmc)
  4. 點擊蒙板按鈕
  5. 檢查11(系列原子是幾乎透明)
  6. Ckick Redraw
+0

我似乎記得一些有關前端材質和後端材質的WPF 3D對象,你們是否設置了它們? – WildCrustacean 2012-04-13 23:48:56

+0

在類Sphere3D:ModelVisual3D中,我添加了集 {this.Content as GeometryModel3D).Material = value; (this.Content as GeometryModel3D).BackMaterial = value; }但效果是一樣的 – 2012-04-13 23:56:29

+0

看來它們在相交時是不呈現的,而其中一個是透明的。 – 2012-04-14 00:09:00

回答

8

對於透明原子,必須禁用z緩衝區寫入。 我不熟悉WPF,但是你可以在Appearance或Material對象中設置它。的發生是因爲以下的

問題:

當透明原子被渲染,它寫入其深度與z緩衝器。由於已經在透明原子的z緩衝區中的z值,因此渲染並應該出現的後續非透明原子不會寫入幀緩衝區,因爲它們的z值不能通過z-測試。

簡而言之,顯卡將透明原子視爲不透明並隱藏它後面的任何東西。

編輯:在研究WPF時,它似乎很高級,沒有直接控制z緩衝區的行爲。

根據this link,發射和鏡面材料不寫入z緩衝區,因此使用這些是您使用透明物體時的解決方案。

+0

謝謝,我發現這個鏈接後,您的文章以及:) – 2012-04-14 00:39:46

+2

這裏有一些不錯的圖片鏈接顯示此問題:http://www.ab4d.com/TransparencySorting.aspx。正如該鏈接所指出的那樣,並不總是需要禁用z緩衝區寫入(或者使用發射或反射材料)。如果您可以訂購視口的孩子,使得相機遠離攝像頭的位置,則不會受到z緩衝區的干擾。從理論上講,這意味着每當相機發生變化時都會跟蹤對象順序,但在實踐中,您可能會遇到一種更簡單的情況,即對象始終以給定順序呈現。 – 2013-07-07 09:17:31