`
jiasongmao
  • 浏览: 666876 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

HLSL自定义渲染特效之完美攻略(中)

    博客分类:
  • WPF
阅读更多

通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过时时更新HLSL代码的各全局变量值同样可以实现动画形式的渲染,非常Cool对吧~。那么本节我将向大家介绍如何在Silverlight平台上实现HLSL动画渲染特效。

BandedSwirl(螺旋波纹)渲染特效为例,我们首先要做的是按照上一节的方法将BandedSwirl.ps文件添加进项目中,同时创建一个对应的BandedSwirl.cs文件:

 

using System.Windows;

using System.Windows.Media;

using System.Windows.Media.Effects;

namespace Silverlight.Shader {

    public class BandedSwirl : ShaderEffect {

        public static DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(BandedSwirl), 0);

        public static DependencyProperty CenterProperty = DependencyProperty.Register("Center", typeof(System.Windows.Point), typeof(BandedSwirl), new PropertyMetadata(new System.Windows.Point(), PixelShaderConstantCallback(0)));

        public static DependencyProperty SpiralstrengthProperty = DependencyProperty.Register("Spiralstrength", typeof(double), typeof(BandedSwirl), new PropertyMetadata(new double(), PixelShaderConstantCallback(1)));

        public static DependencyProperty DistancethresholdProperty = DependencyProperty.Register("Distancethreshold", typeof(double), typeof(BandedSwirl), new PropertyMetadata(new double(), PixelShaderConstantCallback(2)));

        public BandedSwirl(PixelShader shader) {

            PixelShader = shader;

            this.UpdateShaderValue(InputProperty);

            this.UpdateShaderValue(CenterProperty);

            this.UpdateShaderValue(SpiralstrengthProperty);

            this.UpdateShaderValue(DistancethresholdProperty);

        }

        public virtual System.Windows.Media.Brush Input {

            get {

                return ((System.Windows.Media.Brush)(GetValue(InputProperty)));

            }

            set {

                SetValue(InputProperty, value);

            }

        }

        public virtual System.Windows.Point Center {

            get {

                return ((System.Windows.Point)(GetValue(CenterProperty)));

            }

            set {

                SetValue(CenterProperty, value);

            }

        }

        public virtual double Spiralstrength {

            get {

                return ((double)(GetValue(SpiralstrengthProperty)));

            }

            set {

                SetValue(SpiralstrengthProperty, value);

            }

        }

        public virtual double Distancethreshold {

            get {

                return ((double)(GetValue(DistancethresholdProperty)));

            }

            set {

                SetValue(DistancethresholdProperty, value);

            }

        }

    }

}

接下来在后台cs代码中创建渲染特效实例:

     pixelShader = new PixelShader() {

        UriSource = GetShaderUri("BandedSwirl.ps")

     };

     BandedSwirl bandedSwirl = new BandedSwirl(pixelShader) {

        Center = new Point(0.5, 0.5),

        Spiralstrength = 1,

        Distancethreshold = 0

     };

     Spirit.Effect = bandedSwirl;

最后就是关键环节了,如何实现动画效果呢?大家是否有注意到BandedSwirl类中的CenterProperty、SpiralstrengthProperty、DistancethresholdProperty这三个DependencyProperty(关联属性)参数,它们分别代表该渲染特效的中心、螺旋强度和延伸阈值。由于是关联属性,所以我们可以直接使用Storyboard去实现基于它们的渐变动画,那么以动态修改Distancethreshold值为例,具体实现代码如下:

BeginShaderAnimation(bandedSwirl, 0, 1, 3, "Distancethreshold");

/// <summary>

/// 启动渲染动画

/// </summary>

private void BeginShaderAnimation(DependencyObject shader, double from, double to, double timeSpanFromSeconds, string dependencyProperty) {

   if (storyboard != null) { storyboard.Stop(); }

   storyboard = new Storyboard();

   storyboard.RepeatBehavior = RepeatBehavior.Forever;

   storyboard.AutoReverse = true;

   doubleAnimation = new DoubleAnimation();

   doubleAnimation.From = from;

   doubleAnimation.To = to;

   doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(timeSpanFromSeconds));

   Storyboard.SetTarget(doubleAnimation, shader);

Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath(dependencyProperty));

   storyboard.Children.Add(doubleAnimation);

   storyboard.Begin();

}

 

通过一个Storyboard故事板,我们让bandedSwirl渲染特效的Distancethreshold值在3秒时间内从0改变到1,然后反序列帧执行并不断循环。至此一个基于HLSL的螺旋波纹渲染特效就制作完成啦!以同样的方法我还特意制作了波浪渲染动画、放大渲染动画、模糊缩放渲染动画、环状发散渲染动画、挤压收缩渲染动画等几个动画,都非常非常的Cool~下面是它们的效果截图:

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alamiye010/archive/2009/09/28/4612735.aspx

 

有些遗憾的是,目前的Silverlight3.0版本仅支持基于pixel(像素)的渲染,暂时还无法实现基于Vertex(顶点)HLSL渲染,但是这些已经很大程度上能够满足我们现有的需求。基于HLSL的动画渲染特效能够通过简单的代码编写再配上合适的图片即可实现诸如光晕、雨雪、云雾、闪电、冰块等环境特效以及爆炸、激光、水晶等魔法特效,这一切一切的实现仅仅使用最大不过几十KB的存储空间,如果让我展望Silverlight的明天,我坚信,明天会更好。

分享到:
评论

相关推荐

    HLSL自定义渲染特效之完美攻略(上)

    总结,HLSL自定义渲染特效的完美攻略上篇可能涵盖了HLSL的基础知识、着色器类型及其应用,以及可能的实战案例。通过学习和实践,开发者可以利用HLSL的强大功能,为游戏和应用程序注入生机,创造出令人震撼的视觉体验...

    HLSL实现卡通渲染茶壶

    首先,HLSL是DirectX中用于编写着色器的语言,它允许开发者创建自定义的像素和顶点着色器,以实现各种复杂的视觉效果。在卡通渲染中,我们通常会用到以下几种HLSL着色器技术: 1. **边缘检测**:通过计算像素之间的...

    HLSL特效(高级特效)

    HLSL支持许多高级特效,如法线贴图、置换贴图、环境光遮蔽、屏幕空间反射、动态模糊、全局光照、物理渲染等。这些特效通过HLSL的强大计算能力,使得游戏和应用的画面更加真实。 **8. 混合和Alpha测试** HLSL提供了...

    HLSL特效 详细讲解shade

    HLSL(High-Level Shader Language)是微软为Direct3D开发的一种高级着色语言,用于GPU编程,特别是在图形渲染和图像处理中。它允许开发者创建复杂的光照、纹理和动画效果,提升图形表现力。 1: HLSL概述 HLSL是专...

    XNA中的HLSL简单应用

    然而,当我们要实现更复杂的渲染效果时,就需要使用HLSL自定义着色器。这通常涉及到创建一个`.fx`文件,其中包含着色器程序,然后在XNA项目中加载和应用这个文件。在`LoadContent()`方法中,`Content.Load("effe")`...

    Unity屏幕特效之Bloom

    Unity Shader是控制游戏画面渲染的关键,通过编写Shader语言(如CG或HLSL)来定制光照、纹理、颜色等视觉元素。在Unity中,Shader脚本通常与材质(Material)配合使用,为游戏对象赋予特定的外观。 二、Bloom特效原理...

    使用HLSL实现景深

    HLSL是微软为Direct3D设计的一种着色语言,它允许开发者编写自定义的顶点和像素着色器,以实现复杂的图形效果。在实现景深时,我们通常会用到像素着色器,因为该效果主要是在像素级别上计算的。 1. **景深基本原理*...

    hlsl流动云彩效果

    【hlsl流动云彩效果】是一种使用高级着色语言(High-Level Shader Language,简称hlsl)来实现的视觉特效,常见于3D游戏和虚拟环境中。hlsl是DirectX的一部分,专为图形处理单元(GPU)设计,允许开发者编写自定义的...

    HLSL Development Cookbook源代码

    HLSL是微软为Direct3D设计的一种高级着色语言,用于编写图形渲染的顶点、像素、几何和计算着色器,以及在现代游戏和图形应用中实现复杂的视觉效果。 源代码文件"4209OT_Code bundle"中可能包含了以下关键知识点: ...

    HLSL初级教程.pdf

    总之,HLSL作为一种强大的图形编程工具,为开发者提供了丰富的可能性,不仅可以用于游戏特效开发,还可以应用于各种图形渲染领域。通过深入学习HLSL及其相关概念和技术,可以实现高质量的视觉效果。

    《DirectX3D HLSL 高级实例精讲》目录和程序截图1

    HLSL代码则编写了这些着色器的具体逻辑,可以实现光照、纹理映射、后期处理等多种视觉特效。 通过深入学习这本书的内容,读者将能够掌握Direct3D HLSL的核心技术,包括但不限于模型加载、效果文件的使用、UI设计...

    HLSL Pixel Shader

    Pixel Shader,又称为像素着色器,是HLSL中的核心部分,主要用于处理渲染过程中的像素级计算,为每个像素赋予颜色、光照、纹理等效果,极大地提升了图像的真实感和表现力。 在描述中提到的任务是使用HLSL Pixel ...

    HLSL开发指南源码及部分书中笔记

    HLSL,全称为高阶着色语言,是DirectX SDK中的一个重要组件,由微软开发,主要用于为图形渲染提供高效的着色器编程。它是一种面向GPU(图形处理器)的编程语言,能够帮助开发者充分利用现代图形硬件的计算能力,实现...

    网络游戏开发-HLSL

    通过编写HLSL代码,开发者可以创建自定义的光照模型、纹理贴图、动态阴影和各种高级视觉特效。 2. HLSL与游戏编程: 在游戏中,HLSL主要用于实现图形渲染的计算密集部分。例如,它可以用来计算角色的表面光照、...

    HLSL初级教程HLSL初级教程

    在DirectX的图形渲染过程中,采用的是管道技术(pipeline),它负责图形的处理与绘制。早期的DirectX版本中,使用的是固定功能管道(fixed function pipeline),开发者可以设定顶点、图元、纹理等数据信息以及管道...

    DirectX_and_HLSL.rar

    在Direct3D中,开发者可以通过HLSL自定义每个阶段的行为,以实现特定的视觉效果。 1. **顶点处理**:在这个阶段,开发者使用顶点着色器来处理模型的顶点数据,进行坐标变换(平移、旋转、缩放)、视锥体裁剪和屏幕...

    2D HLSL简单范例

    这个例子中的"2d HLSL"文件可能包含了上述步骤中的HLSL源代码,以及相关的C#代码片段,展示了如何将自定义的2D着色器应用到XNA的SpriteBatch上。通过不断试验和调整HLSL代码,开发者可以创造出各种独特的视觉效果,...

    UE4的自定义ScreenPass和MRT输出

    在UE4(Unreal Engine 4)中,自定义ScreenPass和MRT(Multiple Render Targets,多重渲染目标)输出是图形编程和渲染管线中的高级技术,它们允许开发者扩展引擎的默认渲染流程,实现独特的视觉效果。本文将深入探讨...

Global site tag (gtag.js) - Google Analytics