最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF使用HLSL實(shí)現(xiàn)百葉窗動(dòng)畫效果

 更新時(shí)間:2023年09月07日 08:23:39   作者:czwy  
百葉窗動(dòng)畫是制作PPT時(shí)常用的動(dòng)畫之一,本文將通過(guò)實(shí)現(xiàn)百葉窗動(dòng)畫效果的例子介紹在WPF中如何使用ShaderEffect,感興趣的小伙伴可以了解一下

百葉窗動(dòng)畫是制作PPT時(shí)常用的動(dòng)畫之一,本文將通過(guò)實(shí)現(xiàn)百葉窗動(dòng)畫效果的例子介紹在WPF中如何使用ShaderEffect。ShaderEffect是使用高級(jí)著色器語(yǔ)言(High Level Shading Language,HLSL)事先制作好并且已經(jīng)編譯過(guò)的效果。先看下百葉窗動(dòng)畫實(shí)現(xiàn)效果:

準(zhǔn)備工作與實(shí)現(xiàn)

  • 編寫和編譯HLSL代碼,創(chuàng)建ShaderEffect。由于HLSL有自己的語(yǔ)言語(yǔ)法,本文不做討論。這里使用一個(gè)已有的的HLSL文件,也是后邊將介紹的一個(gè)HLSL編輯器工具Shazzam Shader Editor中的案例。
  • 定義像素著色器,在UI元素中使用像素著色器,并通過(guò)動(dòng)畫設(shè)置百葉窗動(dòng)畫。
    百葉窗效果的像素著色器代碼中:
public class BlindsShader : ShaderEffect
{
    public static readonly DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(BlindsShader), 0);
    public static readonly DependencyProperty ProgressProperty = DependencyProperty.Register("Progress", typeof(double), typeof(BlindsShader), new UIPropertyMetadata(((double)(30D)), PixelShaderConstantCallback(0)));
    public static readonly DependencyProperty NumberOfBlindsProperty = DependencyProperty.Register("NumberOfBlinds", typeof(double), typeof(BlindsShader), new UIPropertyMetadata(((double)(5D)), PixelShaderConstantCallback(1)));
    public static readonly DependencyProperty Texture2Property = ShaderEffect.RegisterPixelShaderSamplerProperty("Texture2", typeof(BlindsShader), 1);
    public BlindsShader()
    {
        PixelShader pixelShader = new PixelShader();
        pixelShader.UriSource = new Uri("/WPFTest;component/Shader/ShaderSource/BlindsShader.ps", UriKind.Relative);
        this.PixelShader = pixelShader;
        this.UpdateShaderValue(InputProperty);
        this.UpdateShaderValue(ProgressProperty);
        this.UpdateShaderValue(NumberOfBlindsProperty);
        this.UpdateShaderValue(Texture2Property);
    }
    public Brush Input
    {
        get
        {
            return ((Brush)(this.GetValue(InputProperty)));
        }
        set
        {
            this.SetValue(InputProperty, value);
        }
    }
    /// <summary>The amount(%) of the transition from first texture to the second texture. </summary>
    public double Progress
    {
        get
        {
            return ((double)(this.GetValue(ProgressProperty)));
        }
        set
        {
            this.SetValue(ProgressProperty, value);
        }
    }
    /// <summary>The number of Blinds strips </summary>
    public double NumberOfBlinds
    {
        get
        {
            return ((double)(this.GetValue(NumberOfBlindsProperty)));
        }
        set
        {
            this.SetValue(NumberOfBlindsProperty, value);
        }
    }
    public Brush Texture2
    {
        get
        {
            return ((Brush)(this.GetValue(Texture2Property)));
        }
        set
        {
            this.SetValue(Texture2Property, value);
        }
    }
}

BlindsShader.ps是編譯好的HLSL文件,Progress表示百葉窗葉片打開(kāi)的進(jìn)度,NumberOfBlinds是百葉窗葉片的數(shù)量,Texture2是百葉窗葉片的紋理(通常使用一個(gè)純色的圖片)。

使用百葉窗效果時(shí),只需在resources中添加著色器和動(dòng)畫,并對(duì)目標(biāo)UI元素的Effect設(shè)置為百葉窗動(dòng)畫。為了展示效果,本例用圖片111.jpg作為grid的背景,用純色圖片blinds.jpg作為葉片紋理。在grid的加載時(shí)觸發(fā)動(dòng)畫設(shè)置百葉窗葉片打開(kāi)的進(jìn)度。

<Window.Resources>
    <ImageBrush x:Key="imageBrush" ImageSource="111.jpg" />
    <ImageBrush x:Key="blindsBrush" ImageSource="blinds.jpg" />
    <local:BlindsShader x:Key="BlindsShader"
                        NumberOfBlinds="4"
                        Progress="0"
                        Texture2="{StaticResource blindsBrush}" />
    <Storyboard x:Key="DefaultBlindsShaderStoryboard" FillBehavior="HoldEnd">
        <DoubleAnimation Storyboard.TargetProperty="(UIElement.Effect).(local:BlindsShader.Progress)"
                            From="0"
                            To="100"
                            Duration="00:00:1.5" />
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Effect)">
            <DiscreteObjectKeyFrame KeyTime="00:00:1.5" Value="{x:Null}" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>
<Grid Background="{StaticResource imageBrush}" Effect="{StaticResource BlindsShader}">
    <Grid.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard x:Name="sbLoaded" Storyboard="{DynamicResource DefaultBlindsShaderStoryboard}" />
        </EventTrigger>
    </Grid.Triggers>
</Grid>

Shazzam Shader Editor

可以使用任何一款編輯器編寫HLSL,然后使用fxc.exe命令行工具編譯(visual studio 2022或者Windows SDK for Windows中含有該工具)。但是Shazzam Shader Editor是一個(gè)免費(fèi)的專門為 WPF 實(shí)現(xiàn)像素著色器而設(shè)計(jì)的一款編輯器,使用它來(lái)編寫像素著色器,可以自動(dòng)生成WPF中的ShaderEffect。

Shazzam Shader Editor已經(jīng)好久沒(méi)有維護(hù)了,其官網(wǎng)似乎也沒(méi)了。原本開(kāi)源在CodePlex上,而 CodePlex 已經(jīng)關(guān)閉。但JohanLarsson 將其 Fork 到了 GitHub 上,https://github.com/JohanLarsson/Shazzam。

打開(kāi)Shazzam Shader Editor,左側(cè)顯示著色器示例和全局設(shè)置(默認(rèn)折疊)。選中具體的著色器后,右側(cè)區(qū)域上方顯示著色其效果,下方選項(xiàng)卡分別顯示HLSL代碼編輯窗口、預(yù)覽調(diào)節(jié)窗口、生成的C#代碼和生成的VB代碼。

HLSL代碼編輯窗口

HLSL代碼文件是以.fx作為后綴名。編譯后的文件后綴名是.ps。編輯窗口中可以編輯修改代碼,按下F5就可以編譯你的HLSL代碼,并在界面上方預(yù)覽效果。編輯器中會(huì)高亮關(guān)鍵詞和方法,雙擊不要松開(kāi)鼠標(biāo)會(huì)彈出相應(yīng)的提示。如何編寫HLSL代碼可以查閱HLSL and Pixel Shaders for XAML Developers這本書,Shazzam Shader Editor中左側(cè)示例中的Tutorial也是配合該書使用的。

預(yù)覽調(diào)節(jié)窗口

在這里可以設(shè)置各種預(yù)覽參數(shù),預(yù)覽HLSL代碼的效果。

生成的C#代碼

這里是Shazzam Shader Editor自動(dòng)生成的用C#編寫的ShaderEffect,本文前邊提到的百葉窗效果的像素著色器代碼也就是從這里直接拷貝過(guò)去的。這里的代碼默認(rèn)的命名空間是Shazzam.Shaders,代碼縮進(jìn)是用Tab??梢栽谥鞔绑w左側(cè)的全局設(shè)置中修改。

生成的VB代碼

這里和生成C#代碼一樣,只是提供VB語(yǔ)言編寫的ShaderEffect。

在WPF中使用用HLSL

Shazzam Shader Editor編譯HLSL后會(huì)生成XXX.ps、XXX.cs、XXX.vb三個(gè)文件,并保存在%LocalAppData%\Shazzam\GeneratedShaders目錄下的XXXEffect目錄中。這里的XXX就是你定義的HLSL的名稱。

在WPF中使用時(shí),需把XXX.ps文件以Resource的形式添加到工程中,然后把XXX.cs文件添加到工程,并根據(jù)項(xiàng)目結(jié)構(gòu),修改XXX.cs中引用XXX.ps文件的路徑即可。

到此這篇關(guān)于WPF使用HLSL實(shí)現(xiàn)百葉窗動(dòng)畫效果的文章就介紹到這了,更多相關(guān)WPF百葉窗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)獲取IIS站點(diǎn)及虛擬目錄信息的方法

    C#實(shí)現(xiàn)獲取IIS站點(diǎn)及虛擬目錄信息的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)獲取IIS站點(diǎn)及虛擬目錄信息的方法,可實(shí)現(xiàn)獲取IIS站點(diǎn)信息及物理路徑等功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • C# 多線程并發(fā)編程基礎(chǔ)小結(jié)

    C# 多線程并發(fā)編程基礎(chǔ)小結(jié)

    本文主要介紹了C# 多線程并發(fā)編程基礎(chǔ)小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • C#程序提示“正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)該文件”的解決辦法

    C#程序提示“正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)該文件”的解決辦法

    這篇文章主要介紹了C#程序提示“正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)該文件”的解決辦法,本文通過(guò)改寫程序代碼實(shí)現(xiàn)解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2015-06-06
  • C#中IntPtr類型的具體使用

    C#中IntPtr類型的具體使用

    本文主要介紹了C#中IntPtr類型的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c# 如何用lock解決緩存擊穿

    c# 如何用lock解決緩存擊穿

    這篇文章主要介紹了c# 如何用lock解決緩存擊穿,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • 使用C#實(shí)現(xiàn)隱藏Excel單個(gè)和多個(gè)工作表的示例詳解

    使用C#實(shí)現(xiàn)隱藏Excel單個(gè)和多個(gè)工作表的示例詳解

    許多?Excel?文件中往往包含用于計(jì)算、中間處理或內(nèi)部引用的數(shù)據(jù)工作表,這些內(nèi)容并不需要對(duì)最終用戶展示,下面我們就來(lái)看看如何使用C#實(shí)現(xiàn)隱藏Excel單個(gè)和多個(gè)工作表吧
    2025-12-12
  • C#排序算法之快速排序

    C#排序算法之快速排序

    下面給出的代碼是以數(shù)組最后一個(gè)元素作為參考元素,這僅是參考元素選取的方式之一。
    2010-09-09
  • 基于C#實(shí)現(xiàn)的UPnP端口映射程序

    基于C#實(shí)現(xiàn)的UPnP端口映射程序

    本文介紹了基于C#實(shí)現(xiàn)的UPnP端口映射程序,該程序包含服務(wù)器端和客戶端,支持TCP端口穿透和自動(dòng)NAT穿透,服務(wù)器端實(shí)現(xiàn)UPnP端口映射和TCP服務(wù)端,客戶端實(shí)現(xiàn)UPnP客戶端類,程序支持多協(xié)議、自動(dòng)重連機(jī)制和安全增強(qiáng),需要的朋友可以參考下
    2026-02-02
  • C#異步編程由淺入深(二)之Async/Await的使用

    C#異步編程由淺入深(二)之Async/Await的使用

    這篇文章主要介紹了C#異步編程由淺入深(二)之Async/Await的作用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 詳解C#如何實(shí)現(xiàn)分割視頻

    詳解C#如何實(shí)現(xiàn)分割視頻

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)將視頻文件分割成一幀幀圖片的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評(píng)論

湖州市| 谷城县| 高陵县| 泸定县| 新疆| 社旗县| 聂拉木县| 通海县| 望谟县| 定西市| 金华市| 务川| 玉屏| 延边| 中阳县| 汾西县| 吕梁市| 延长县| 宜章县| 文成县| 商南县| 田林县| 梁山县| 团风县| 吴桥县| 江口县| 南陵县| 海门市| 始兴县| 积石山| 南丰县| 肃北| 吴旗县| 穆棱市| 保康县| 黔西县| 沽源县| 武义县| 独山县| 额尔古纳市| 昌乐县|