none
WPF4以上におけるBevel効果の利用について RRS feed

  • 質問

  • 現在、WPFを利用したGUIを構築していますが、その中でBevel効果を利用したいと考えております。

    しかしながら、Bitmapeffect内のBevel効果はWPF4以上において記述しても効果が表れてくれません。

    WPF3.5以下を利用すればいいだけの話なのですが、機能的にWPF4以上が魅力的です。WPF4以上でBevel効果を利用する方法はないのでしょうか?


    参考に、効果が表れなかった際の記述をおいておきます。

                <Rectangle Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="88" Margin="270,268,0,0" Stroke="Black" VerticalAlignment="Top" Width="144">
                    <Rectangle.BitmapEffect>
                        <BevelBitmapEffect EdgeProfile="CurvedOut" BevelWidth="20" Relief="0.5" Smoothness="0.5"/>
                    </Rectangle.BitmapEffect>
                </Rectangle>


    2017年11月4日 16:12

回答

  • すでにご覧になられているかもしれませんが、同内容の過去スレッドがありましたのでリンクしておきます。

    XAMLに書いたBevelBitmapEffectが機能しない
    https://social.msdn.microsoft.com/Forums/netframework/ja-JP/b1417bc3-7d16-4f4b-b07d-ca83fa62ae38/xamlbevelbitmapeffect?forum=wpfja

    2017年11月4日 23:26
  • 質問をするときは最低限のマナーとして、開発環境のバージョンを詳しく書きましょう。

    WPF4でBevelをどうしても実現したければ、以下のような方法もあります。

    Simple Adorner-Based Bevel Effect - CodeProject

    単純な矩形に対するBevelであれば、半透明のPolygon要素(台形)を四隅にオーバーレイしたり、それをControlTemplateでStyle化したりするアドホックな方法でも切り抜けられると思います。

    もしTextBlockなどの任意形状に対してBevelをかける必要があれば、自前でHLSLを使ってカスタムシェーダーエフェクトを記述する方法しかないと思われます。簡単に思いつくのはアルファマップ(アルファチャンネル)にerode/dilateアルゴリズムを適用した結果を、もとのアルファマップから差し引いたマスクを用いて、シェーダー定数で渡された光源情報をもとにBevelエッジ部の陰影計算を行なう方法です。モルフォロジー演算は適用対象を2値化すれば簡単に実装できますが、アンチエイリアスが必要な場合は複雑になります。

    どこまでの機能を実現したいのか、まず要求仕様をはっきりさせて、その後で実現手段を検討・調査・選択してださい。

    2017年11月5日 9:51

すべての返信

  • すでにご覧になられているかもしれませんが、同内容の過去スレッドがありましたのでリンクしておきます。

    XAMLに書いたBevelBitmapEffectが機能しない
    https://social.msdn.microsoft.com/Forums/netframework/ja-JP/b1417bc3-7d16-4f4b-b07d-ca83fa62ae38/xamlbevelbitmapeffect?forum=wpfja

    2017年11月4日 23:26
  • 質問をするときは最低限のマナーとして、開発環境のバージョンを詳しく書きましょう。

    WPF4でBevelをどうしても実現したければ、以下のような方法もあります。

    Simple Adorner-Based Bevel Effect - CodeProject

    単純な矩形に対するBevelであれば、半透明のPolygon要素(台形)を四隅にオーバーレイしたり、それをControlTemplateでStyle化したりするアドホックな方法でも切り抜けられると思います。

    もしTextBlockなどの任意形状に対してBevelをかける必要があれば、自前でHLSLを使ってカスタムシェーダーエフェクトを記述する方法しかないと思われます。簡単に思いつくのはアルファマップ(アルファチャンネル)にerode/dilateアルゴリズムを適用した結果を、もとのアルファマップから差し引いたマスクを用いて、シェーダー定数で渡された光源情報をもとにBevelエッジ部の陰影計算を行なう方法です。モルフォロジー演算は適用対象を2値化すれば簡単に実装できますが、アンチエイリアスが必要な場合は複雑になります。

    どこまでの機能を実現したいのか、まず要求仕様をはっきりさせて、その後で実現手段を検討・調査・選択してださい。

    2017年11月5日 9:51