PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WPF: ShaderEffect + RenderTransform -> verzerrtes Bild


PatkIllA
2011-08-03, 20:12:37
Ich habe eine WPF Anwendung in der eine Karte dargestellt wird. Die Karte kann optional in Graustufen dargestellt werden, was mit einem ShaderEffect passiert. Zusätzlich kann in der Karte gezommt werden. Die Vorschau passiert dabei mit einer Matrix in der Rendertransform-Eigenschaft.
Das Problem ist jetzt, dass wenn der ShaderEffect aktiviert ist und gezommt wird, wird ab einem gewissen ZoomFaktor das Bild verzerrt oder Ausschnitt stimmt nicht mehr.

Ich habe es bislang nur unter Windows 7 getestet. Interessant ist, dass der Wert ab dem das passiert auf der NVIDIA Quadro auf der Arbeit und meiner privaten ATI unterschiedlich ist.

Ich habe das ganze mal auf das nötigste gestützt hochgeladen:
http://patkilla.wildstallyons.de/public/ShaderTransformTest.rar

Vereinfacht sieht das so aus, aber interactiv sieht man das erst richtig.
<Window x:Class="ShaderTransformTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ShaderTransformTest"
Title="MainWindow" Height="350" Width="525">
<Canvas Grid.Row="1" Width="1672" Height="800" ClipToBounds="True">
<FrameworkElement.CacheMode>
<BitmapCache />
</FrameworkElement.CacheMode>
<FrameworkElement.Effect>
<local:GrayScaleEffect/>
</FrameworkElement.Effect>
<FrameworkElement.RenderTransform>
<ScaleTransform ScaleX="12" ScaleY="12" />
</FrameworkElement.RenderTransform>
<Image Source="map.png" UseLayoutRounding="True"/>
<TextBlock Text="MyTextBlock" Foreground="Lime" FontSize="64"/>
</Canvas>
</Window>

CoconutKing
2011-08-03, 20:58:29
passiert bei mir nur, wenn der cache aktiviert ist. schaus mir morgen mal an, hab jetzt nur bock gehabt f5 zu drücken :)

PatkIllA
2011-08-03, 21:06:42
Ohne Cache wird es aber elendig langsam. In der richtigen Version ist da noch was drüber, was interaktiv mit der Mouse bearbeitet wird. Zusätzlich hat die Matrix auch noch drehen und Translation. Da hüpft es dann ab einem gewissen Zoom wild hin und her.
Bei der vereinfachten Version bleibt er dann sogar hängen und stürzt ab.

PatkIllA
2011-08-04, 20:40:33
Ich hab zumindest schon mal erfahren, dass da wohl die maximale Größe des Rendertargets limitert.
Bei der Quadro 570M tritt der Effekt eher auf als bei einer Radeon 5870. Wenn das Bild kleiner ist kann der Faktor größer sein. Wenn das Bild quadratisch ist, dann tritt zumindest der Effekt mit dem Seitenverhältnis nicht auf.

BeetleatWar1977
2011-08-04, 21:11:32
Und wenn du zuerst den nötigen Bereich zurückrechnest und nur den Ausschnitt vergrösserst? - oder brauchst du immer die ganze Karte dargestellt?

PatkIllA
2011-08-04, 21:15:59
Und wenn du zuerst den nötigen Bereich zurückrechnest und nur den Ausschnitt vergrösserst? - oder brauchst du immer die ganze Karte dargestellt?
Das ganze ist eigentlich nur für die Vorschau. Wenn man die Karte an die richtige Stelle geschoben hat bzw. reingezoomt hat wird das Bild eh nur aus den Daten gezeichnet. Die Matrix aus den Mausbewegungen/Mausraddrehungen auszurechnen ist halt recht einfach.
Das Problem tritt ja auch nur auf, wenn der Effekt aktiviert ist. Ohne kann ich problemlos zoomen.

BeetleatWar1977
2011-08-04, 21:41:59
Welche PS Version benutzt du?

PatkIllA
2011-08-04, 21:53:02
Welche PS Version benutzt du?
2.0 Das muss notfalls auch ohne Hardwarebeschleunigung funktionieren.

ich hatte auch schon mal überlegt die Transformation selbst im Shader zu machen und einfach dort die entsprechende Stelle zu samplen.

BeetleatWar1977
2011-08-04, 21:59:56
du kannst auch 3 in Software laufen lassen - aber gut.

Setzt deinen grayscaler doch in eine Matrix, sollte eigentlich fixer sein.

float3 grayscale =(0.3f,0.59f,0.11f);
float gray =dot (color.rgb,grayscale);

Edit: welches Texturformat eigentlich?

PatkIllA
2011-08-04, 22:15:06
Seit wann geht das mit Version 3 in Software bei WPF? Ist aber auch egal, da ich da ja nichts von brauche
Kann man das Textureformat bestimmen? Bei WPF kriegt man ja nicht mal direkt eine Matrix in den Shader.

BeetleatWar1977
2011-08-04, 22:28:34
Seit wann geht das mit Version 3 in Software bei WPF? Ist aber auch egal, da ich da ja nichts von brauche
Kann man das Textureformat bestimmen? Bei WPF kriegt man ja nicht mal direkt eine Matrix in den Shader.
Unterstützung von Pixel Shader 3

WPF 4 Builds oben auf der ShaderEffect-Unterstützung haben 3.5 SP1 in WPF eingeführt, indem sie es Anwendungen ermöglicht haben, Effekte mit Pixel Shader (PS) Version 3.0 zu schreiben. Das PS 3.0-Shadermodell ist ausgereifter als PS 2.0 und ermöglicht noch mehr Effekte auf unterstützter Hardware.

Ich hau mich jetzt ins Bette - gucke morgen mal genauer.

PatkIllA
2011-08-04, 22:30:14
Ich hau mich jetzt ins Bette - gucke morgen mal genauer.
Shader 3 setzt bei WPF eben "unterstützte Hardware" voraus.
Nur hilft mir das bei dem eigentlichen problem nicht weiter.

BeetleatWar1977
2011-08-05, 07:09:30
Nehmen wir an, deine Karte ist 10MB groß und du zoomst um den Faktor 12 - 12²*10 wären 1,44GB - wenn er es wirklich skaliert.


Und wenn du das Bild als Textur auf z.B. einen Würfel legst, und Größe und Position des Objektes als Zoom benutzt?


Edit: Vielleicht hilft auch das: http://deepzoom.codeplex.com/