ShaderEffect 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
를 사용하여 PixelShader사용자 지정 비트맵 효과를 제공합니다.
public ref class ShaderEffect abstract : System::Windows::Media::Effects::Effect
public abstract class ShaderEffect : System.Windows.Media.Effects.Effect
type ShaderEffect = class
inherit Effect
Public MustInherit Class ShaderEffect
Inherits Effect
- 상속
예제
다음 코드 예제에서는 클래스에서 파생 하는 방법을 보여 있습니다 ShaderEffect .
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Reflection;
namespace ShaderEffectDemo
{
public class ThresholdEffect : ShaderEffect
{
private static PixelShader _pixelShader =
new PixelShader() { UriSource = MakePackUri("ThresholdEffect.fx.ps") };
public ThresholdEffect()
{
PixelShader = _pixelShader;
UpdateShaderValue(InputProperty);
UpdateShaderValue(ThresholdProperty);
UpdateShaderValue(BlankColorProperty);
}
// MakePackUri is a utility method for computing a pack uri
// for the given resource.
public static Uri MakePackUri(string relativeFile)
{
Assembly a = typeof(ThresholdEffect).Assembly;
// Extract the short name.
string assemblyShortName = a.ToString().Split(',')[0];
string uriString = "pack://application:,,,/" +
assemblyShortName +
";component/" +
relativeFile;
return new Uri(uriString);
}
///////////////////////////////////////////////////////////////////////
#region Input dependency property
public Brush Input
{
get { return (Brush)GetValue(InputProperty); }
set { SetValue(InputProperty, value); }
}
public static readonly DependencyProperty InputProperty =
ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(ThresholdEffect), 0);
#endregion
///////////////////////////////////////////////////////////////////////
#region Threshold dependency property
public double Threshold
{
get { return (double)GetValue(ThresholdProperty); }
set { SetValue(ThresholdProperty, value); }
}
public static readonly DependencyProperty ThresholdProperty =
DependencyProperty.Register("Threshold", typeof(double), typeof(ThresholdEffect),
new UIPropertyMetadata(0.5, PixelShaderConstantCallback(0)));
#endregion
///////////////////////////////////////////////////////////////////////
#region BlankColor dependency property
public Color BlankColor
{
get { return (Color)GetValue(BlankColorProperty); }
set { SetValue(BlankColorProperty, value); }
}
public static readonly DependencyProperty BlankColorProperty =
DependencyProperty.Register("BlankColor", typeof(Color), typeof(ThresholdEffect),
new UIPropertyMetadata(Colors.Transparent, PixelShaderConstantCallback(1)));
#endregion
}
}
다음 코드 예제에서는 이전 ShaderEffect 클래스에 해당하는 셰이더를 보여 줍니다.
// Threshold shader
// Object Declarations
sampler2D implicitInput : register(s0);
float threshold : register(c0);
float4 blankColor : register(c1);
//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 color = tex2D(implicitInput, uv);
float intensity = (color.r + color.g + color.b) / 3;
float4 result;
if (intensity > threshold)
{
result = color;
}
else
{
result = blankColor;
}
return result;
}
다음 XAML은 사용자 지정 셰이더 효과를 사용하는 방법을 보여줍니다.
<Window x:Class="ShaderEffectDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ShaderEffectDemo"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:ThresholdEffect x:Key="thresholdEffect" Threshold="0.25" BlankColor="Orange" />
</Window.Resources>
<Grid Effect="{StaticResource thresholdEffect}">
</Grid>
</Window>
설명
클래스에서 ShaderEffect 파생하여 단일 픽셀 셰이더를 기반으로 사용자 지정 효과를 구현합니다.
다음 단계에서는 사용자 지정 효과를 만드는 방법을 보여줍니다.
PixelShader 미리 컴파일된 HLSL(High Level Shading Language) 바이트 코드에서 로드합니다.
효과 및 기반 표면 입력의 매개 변수를 Brush나타내는 종속성 속성을 정의합니다. 오버로드 중 RegisterPixelShaderSamplerProperty 하나를 사용하여 이러한 입력을 HLSL 바이트 코드에서 참조되는 레지스터 번호와 연결합니다.
샘플러 수는 4개로 제한됩니다.
PS 3.0 셰이더를 사용하는 경우 다음 제한 사항이 적용됩니다.
PS 3.0 셰이더가 할당되면 샘플러 수가 8로 증가합니다. 다른 셰이더 앞에 PS 3.0 셰이더를 할당하여 샘플러 8개 등록을 사용하도록 설정합니다.
부동 소수에 대한 224의 전체 셰이더 상수 레지스터 제한이 사용됩니다. 자세한 내용은 ps_3_0 참조하세요.
다음 데이터 형식은 PS 3.0 셰이더에서만 지원됩니다. 하위 셰이더 버전에서 사용되는 경우 예외가 throw됩니다.
int및 형식을 변환할 수 있습니다.intuintbytesbytelongulongshortushortcharbool
PS 3.0에 대한 하드웨어 지원이 없는 컴퓨터에 유효한 PS 3.0 셰이더가 로드되면 셰이더는 무시됩니다. 셰이더가 유효하지 않으면 예외가 throw되지 않습니다.
컴퓨터에 둘 이상의 비디오 카드가 있는 경우 동작은 가장 지원되지 않은 비디오 카드로 정의됩니다. 예를 들어 컴퓨터에 PS 3.0을 지원하는 비디오 카드가 두 개 있고 그 중 하나가 지원되지 않는 경우 컴퓨터가 PS 3.0을 지원하지 않는 경우와 동작이 동일합니다.
컴퓨터가 하드웨어에서 PS 3.0 렌더링을 지원하지만 잘못된 PS 3.0 셰이더가 할당 InvalidPixelShaderEncountered 되면 이벤트가 발생합니다. 잘못된 PS 3.0 셰이더의 예는 플래그로
ps_3_sw컴파일된 셰이더입니다. 클래스는 ShaderEffect fxc.exe전달된 플래그로ps_3_0컴파일된 PS 3.0 셰이더만 허용합니다. 자세한 내용은 Effect-Compiler 도구를 참조하세요.
메모
PS 2.0 셰이더는 소프트웨어에서 렌더링할 때 실행됩니다. 그러나 PS 3.0이 시스템의 하드웨어에서 지원되더라도 PS 3.0 셰이더는 소프트웨어 렌더링 중에 실행되지 않습니다.
생성자
| Name | Description |
|---|---|
| ShaderEffect() |
ShaderEffect 클래스의 새 인스턴스를 초기화합니다. |
필드
| Name | Description |
|---|---|
| PixelShaderProperty |
PixelShader 종속성 속성을 식별합니다. |
속성
| Name | Description |
|---|---|
| CanFreeze |
개체를 수정할 수 없게 만들 수 있는지 여부를 나타내는 값을 가져옵니다. (다음에서 상속됨 Freezable) |
| DdxUvDdyUvRegisterIndex |
화면 공간과 관련하여 텍스처 좌표의 부분 파생에 사용할 셰이더 레지스터를 나타내는 값을 가져오거나 설정합니다. |
| DependencyObjectType |
이 인스턴스의 DependencyObjectType CLR 형식을 래핑하는 값을 가져옵니다. (다음에서 상속됨 DependencyObject) |
| Dispatcher |
연결된 이 값을 DispatcherDispatcherObject 가져옵니다. (다음에서 상속됨 DispatcherObject) |
| EffectMapping |
파생 클래스에서 재정의되는 경우 효과를 통해 마우스 입력 및 좌표계를 변환합니다. (다음에서 상속됨 Effect) |
| HasAnimatedProperties |
하나 이상의 AnimationClock 개체가 이 개체의 종속성 속성과 연결되어 있는지 여부를 나타내는 값을 가져옵니다. (다음에서 상속됨 Animatable) |
| IsFrozen |
개체를 현재 수정할 수 있는지 여부를 나타내는 값을 가져옵니다. (다음에서 상속됨 Freezable) |
| IsSealed |
이 인스턴스가 현재 봉인되어 있는지 여부를 나타내는 값을 가져옵니다(읽기 전용). (다음에서 상속됨 DependencyObject) |
| PaddingBottom |
효과의 출력 텍스처가 아래쪽 가장자리를 따라 입력 텍스처보다 크다는 것을 나타내는 값을 가져오거나 설정합니다. |
| PaddingLeft |
효과의 출력 텍스처가 왼쪽 가장자리를 따라 입력 텍스처보다 크다는 것을 나타내는 값을 가져오거나 설정합니다. |
| PaddingRight |
효과의 출력 텍스처가 오른쪽 가장자리를 따라 입력 텍스처보다 크다는 것을 나타내는 값을 가져오거나 설정합니다. |
| PaddingTop |
효과의 출력 텍스처가 위쪽 가장자리를 따라 입력 텍스처보다 크다는 것을 나타내는 값을 가져오거나 설정합니다. |
| PixelShader |
효과에 PixelShader 사용할 값을 가져오거나 설정합니다. |
메서드
| Name | Description |
|---|---|
| ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
지정된 에 AnimationClock 적용합니다 DependencyProperty. 속성에 이미 애니메이션이 적용된 HandoffBehavior 경우 지정된 속성이 사용됩니다. (다음에서 상속됨 Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
지정된 에 AnimationClock 적용합니다 DependencyProperty. 속성에 이미 애니메이션 SnapshotAndReplace 이 적용된 경우 핸드오프 동작이 사용됩니다. (다음에서 상속됨 Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
지정된 DependencyProperty에 애니메이션을 적용합니다. 애니메이션은 다음 프레임이 렌더링될 때 시작됩니다. 지정된 속성이 이미 애니메이션 효과를 준 경우 지정된 HandoffBehavior 속성이 사용됩니다. (다음에서 상속됨 Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
지정된 DependencyProperty에 애니메이션을 적용합니다. 애니메이션은 다음 프레임이 렌더링될 때 시작됩니다. 지정된 속성이 이미 애니메이션 SnapshotAndReplace 효과를 준 경우 핸드오프 동작이 사용됩니다. (다음에서 상속됨 Animatable) |
| CheckAccess() |
호출 스레드에 이 DispatcherObject액세스 권한이 있는지 여부를 확인합니다. (다음에서 상속됨 DispatcherObject) |
| ClearValue(DependencyProperty) |
속성의 로컬 값을 지웁니다. 지울 속성은 식별자에 의해 DependencyProperty 지정됩니다. (다음에서 상속됨 DependencyObject) |
| ClearValue(DependencyPropertyKey) |
읽기 전용 속성의 로컬 값을 지웁니다. 지울 속성은 .에 DependencyPropertyKey의해 지정됩니다. (다음에서 상속됨 DependencyObject) |
| Clone() |
이 개체의 수정 가능한 복제본을 만들어 이 ShaderEffect 개체 값의 전체 복사본을 만듭니다. 이 개체의 종속성 속성을 복사할 때 이 메서드는 리소스 참조 및 데이터 바인딩(더 이상 확인되지 않을 수 있음)을 복사하지만 애니메이션이나 현재 값은 복사하지 않습니다. |
| CloneCore(Freezable) |
인스턴스를 기본(애니메이션이 아닌) 속성 값을 사용하여 지정된 Freezable 복제본(전체 복사본)으로 만듭니다. |
| CloneCurrentValue() |
이 개체의 수정 가능한 복제본을 만들어 이 ShaderEffect 개체의 현재 값에 대한 전체 복사본을 만듭니다. 리소스 참조, 데이터 바인딩 및 애니메이션은 복사되지 않지만 현재 값은 복사됩니다. |
| CloneCurrentValueCore(Freezable) |
인스턴스를 현재 속성 값을 사용하여 지정된 Freezable 복제본의 수정 가능한 클론(전체 복사본)으로 만듭니다. |
| CoerceValue(DependencyProperty) |
지정된 종속성 속성의 값을 강제 변환합니다. 이 작업은 호출 CoerceValueCallback시 종속성 속성에 대한 속성 메타데이터에 지정된 함수 DependencyObject 를 호출하여 수행됩니다. (다음에서 상속됨 DependencyObject) |
| CreateInstance() |
Freezable 클래스의 새 인스턴스를 초기화합니다. (다음에서 상속됨 Freezable) |
| CreateInstanceCore() |
파생 클래스의 새 인스턴스를 Freezable 만듭니다. |
| Equals(Object) |
제공된 DependencyObject 항목이 현재 DependencyObject와 같은지 여부를 확인합니다. (다음에서 상속됨 DependencyObject) |
| Freeze() |
현재 개체를 수정할 수 없게 만들고 해당 IsFrozen 속성을 .로 |
| FreezeCore(Boolean) |
이 Animatable 개체를 수정할 수 없게 만들거나 수정할 수 없게 만들 수 있는지 여부를 결정합니다. (다음에서 상속됨 Animatable) |
| GetAnimationBaseValue(DependencyProperty) |
지정된 값의 애니메이션이 적용되지 않은 값을 반환합니다 DependencyProperty. (다음에서 상속됨 Animatable) |
| GetAsFrozen() |
기본(애니메이션이 아닌) 속성 값을 사용하여 고정된 복사본 Freezable을 만듭니다. 복사본이 고정되어 있으므로 고정된 하위 개체는 참조로 복사됩니다. (다음에서 상속됨 Freezable) |
| GetAsFrozenCore(Freezable) |
기본(애니메이션이 적용되지 않은) 속성 값을 사용하여 지정된 Freezable 인스턴스의 고정 클론을 만듭니다. |
| GetCurrentValueAsFrozen() |
using 현재 속성 값의 고정 복사본을 Freezable 만듭니다. 복사본이 고정되어 있으므로 고정된 하위 개체는 참조로 복사됩니다. (다음에서 상속됨 Freezable) |
| GetCurrentValueAsFrozenCore(Freezable) |
현재 인스턴스를 지정된 복제본의 고정 클론으로 만듭니다 Freezable. 개체에 애니메이션 종속성 속성이 있는 경우 현재 애니메이션 값이 복사됩니다. |
| GetHashCode() |
이에 DependencyObject대한 해시 코드를 가져옵니다. (다음에서 상속됨 DependencyObject) |
| GetLocalValueEnumerator() |
이 DependencyObject속성에 대한 값을 로컬로 설정한 종속성 속성을 결정하기 위한 특수 열거자를 만듭니다. (다음에서 상속됨 DependencyObject) |
| GetType() |
현재 인스턴스의 Type 가져옵니다. (다음에서 상속됨 Object) |
| GetValue(DependencyProperty) |
이 인스턴스 DependencyObject에 대한 종속성 속성의 현재 유효 값을 반환합니다. (다음에서 상속됨 DependencyObject) |
| InvalidateProperty(DependencyProperty) |
지정된 종속성 속성의 유효 값을 다시 평가합니다. (다음에서 상속됨 DependencyObject) |
| MemberwiseClone() |
현재 Object단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
| OnChanged() |
현재 Freezable 개체가 수정될 때 호출됩니다. (다음에서 상속됨 Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
이 멤버는 Windows Presentation Foundation(WPF) 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. (다음에서 상속됨 Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
방금 설정된 데이터 멤버에 대해 적절한 컨텍스트 포인터가 DependencyObjectType 설정되었는지 확인합니다. (다음에서 상속됨 Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
형식DependencyObject의 OnPropertyChanged(DependencyPropertyChangedEventArgs) 변경된 종속성 속성에 대한 응답으로 처리 Changed 기를 호출하는 구현도 재정 Freezable 의합니다. (다음에서 상속됨 Freezable) |
| PixelShaderConstantCallback(Int32) |
종속성 속성 값을 픽셀 셰이더의 float 상수 레지스터와 연결합니다. |
| PixelShaderSamplerCallback(Int32, SamplingMode) |
종속성 속성 값을 픽셀 셰이더의 샘플러 레지스터와 연결합니다 SamplingMode. |
| PixelShaderSamplerCallback(Int32) |
종속성 속성 값을 픽셀 셰이더의 샘플러 레지스터와 연결합니다. |
| ReadLocalValue(DependencyProperty) |
종속성 속성의 로컬 값(있는 경우)을 반환합니다. (다음에서 상속됨 DependencyObject) |
| ReadPreamble() |
Freezable 유효한 스레드에서 액세스하고 있는지 확인합니다. 상속자는 Freezable 종속성 속성이 아닌 데이터 멤버를 읽는 API의 시작 부분에서 이 메서드를 호출해야 합니다. (다음에서 상속됨 Freezable) |
| RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode) |
셰이더 샘플러 레지스터와 종속성 속성을 연결합니다 SamplingMode. |
| RegisterPixelShaderSamplerProperty(String, Type, Int32) |
셰이더 샘플러 레지스터와 종속성 속성을 연결합니다. |
| SetCurrentValue(DependencyProperty, Object) |
해당 값 원본을 변경하지 않고 종속성 속성의 값을 설정합니다. (다음에서 상속됨 DependencyObject) |
| SetValue(DependencyProperty, Object) |
종속성 속성 식별자에 의해 지정된 종속성 속성의 로컬 값을 설정합니다. (다음에서 상속됨 DependencyObject) |
| SetValue(DependencyPropertyKey, Object) |
종속성 속성의 식별자에 의해 DependencyPropertyKey 지정된 읽기 전용 종속성 속성의 로컬 값을 설정합니다. (다음에서 상속됨 DependencyObject) |
| ShouldSerializeProperty(DependencyProperty) |
serialization 프로세스가 제공된 종속성 속성의 값을 serialize해야 하는지 여부를 나타내는 값을 반환합니다. (다음에서 상속됨 DependencyObject) |
| ToString() |
현재 개체를 나타내는 문자열을 반환합니다. (다음에서 상속됨 Object) |
| UpdateShaderValue(DependencyProperty) |
지정된 종속성 속성에 해당하는 셰이더 상수 또는 샘플러를 업데이트해야 함을 효과에 알릴 수 있습니다. |
| VerifyAccess() |
호출 스레드가 이에 DispatcherObject액세스할 수 있도록 합니다. (다음에서 상속됨 DispatcherObject) |
| WritePostscript() |
에 Changed 대한 Freezable 이벤트를 발생시키고 해당 OnChanged() 메서드를 호출합니다. 파생 Freezable 되는 클래스는 종속성 속성으로 저장되지 않은 클래스 멤버를 수정하는 API의 끝에 이 메서드를 호출해야 합니다. (다음에서 상속됨 Freezable) |
| WritePreamble() |
Freezable 고정되지 않고 유효한 스레딩 컨텍스트에서 액세스되고 있는지 확인합니다. Freezable 상속자는 종속성 속성이 아닌 데이터 멤버에 쓰는 API의 시작 부분에서 이 메서드를 호출해야 합니다. (다음에서 상속됨 Freezable) |
이벤트
| Name | Description |
|---|---|
| Changed |
포함된 개체 또는 개체를 수정할 때 Freezable 발생합니다. (다음에서 상속됨 Freezable) |