5

私にとってバグと思われる問題に遭遇しました。結晶内の原子を視覚化するアプリを作成しています。その問題は、透明なオブジェクトを描画し、オブジェクトを背後に隠すことです。

ここに画像の説明を入力

コードは次のとおりです。

        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 などに変更すると、「カット」アトムはありません。この投稿をグーグル検索しましたが、与えられたアドバイスはこのケースには当てはまりません。

これは 3D に適用された 2D ブラシのバグですか?

完全なソース コードは、 http ://alloysvisualisation.codeplex.comの dll とテスト ファイルhttp://alloysvisualisation.codeplex.com/releasesベータ リンクにあります。

再現する手順:

  1. ランチアプリ
  2. ファイルを開くボタンをクリック
  3. テスト ファイル (xyzT2000.chmc) を開く
  4. マスクボタンをクリック
  5. チェック11(原子の並びがほぼ透明)
  6. クリック再描画
4

1 に答える 1

9

透過アトムの場合、z-buffer-writing を無効にする必要があります。私は WPF に慣れていませんが、おそらくこれを Appearance または Material オブジェクトなどで設定できます。

この問題は、次の理由で発生します。

透明なアトムがレンダリングされると、その深度が z バッファに書き込まれます。レンダリングされて表示されるはずの後続の非透明アトムは、フレーム バッファーに書き込まれません。これは、透明アトムの z バッファーに既に z 値があるため、それらの z 値が z テストに失敗するためです。

つまり、グラフィックス カードは透明なアトムを不透明として扱い、その背後にあるものをすべて隠します。

編集: WPF を調べると、z バッファーの動作を直接制御することなく、かなり高レベルに見えます。

このリンクによると、エミッシブ マテリアルとスペキュラ マテリアルは z バッファに書き込まれないため、透明なオブジェクトを操作する場合は、これらを使用することをお勧めします。

于 2012-04-14T00:16:17.647 に答える