Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

1

22.11.2013, 23:44

[Gelöst] HLSL Werte im ConstanBuffer ungenau

Hallo,

ich bin über ein Problem gestolpert, dass ich kleine Artefakte beim rendern an den Texturrändern habe und glaube das Problem darauf eingekreist zu haben, dass ein Wert im Shader aus mir unerklärlichen Gründen gerundet wird.
Im Anhang hab ich mal Screenshots davon gemacht, was der Visual Studio Graphics Debugger sagt. Der Wert wie er im Constant Buffer steht ist richtig (0.03125) jedoch erhalte ich den Wert 0.0313 wenn ich den Shader debugge. Da es sich um einen Wert handelt, der in die Berechnung der UV-Koordinaten mit einfließt erklärt das meiner Meinung nach auch, warum teilweise Werte aus aus benachbarten Tiles in meinem Texturatlas benutzt werden.

Ich benutze DirectX 11 mit FeatureLevel 10 und Shader Model 4.0 (FeatureLevel 10.1, 11 und SM5 in allen möglichen Kombinationen hab ich auch schon durchprobiert) und das Problem tritt auch mit dem ReferenceDevice auf.

Mein Frage ist also: Kann das sein? Oder habe ich etwas übersehen? Und kann ich etwas dagegen machen? Mit Point-Filter sind die Artefakte noch zu verschmerzen, aber wenn ich Anisotropisch Filtern möchte, dann sieht das nur noch grässlich aus.

Viel dank im Voraus :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sylence« (23.11.2013, 14:20)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

23.11.2013, 01:27

Ich würde eher vermuten, dass der Shader Debugger hier einfach nur bei der Ausgabe merkwürdig rundet. Wie genau berechnest du denn die Texturkoordinaten? Sind die Koordinaten deiner Vertices auch exakt an Pixeln ausgerichtet?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

23.11.2013, 11:25

Das dürfte wirklich nur die Anzeige-Rundung im Shader Debugger sein. Texturatlanten leiden allgemein an Randpixel-Problemen, bei denen durch Texturfilter Farben aus benachbarten Texturbereichen einberechnet werden, die aber gar nicht mehr zu dem von Dir gewünschten Ausschnitt gehören.

Gegenmaßnahmen:

Du kannst zum Einen die Texturfilter abschalten. Also "Point" in allen Filterparametern. Das solltest Du auch tun, um zumindest die Grundfehler auszumerzen. Deine empfundene Wertabweichung von 0.0313 != 0.03125 ist noch stressfrei von der GPU zu bewältigen, das ist wirklich nur ein Anzeigeproblem. Aber irgendwann hört die Genauigkeit der Zahlendarstellung auch auf der GPU auf. Bei Standard-Floats kommt das üblicherweise nach 6 bis 7 signifikanten Ziffern, also z.B. 0.03125125 != 0.03125126. Hier hilft ein minimales Offset in die richtige Richtung, also z.B. 10^-6 vom Wunsch-Texturausschnitt gesehen nach innen.

Und wenn Du doch Texturfilter haben willst - was ich allgemein für sehr zuträglich zur Bildqualität empfinde, sobald man 2D-Grafiken rotiert, skaliert, streckt oder schert - dann musst Du damit rechnen, dass die Grafikkarte einen größeren Bereich als nur genau einen Texel sampled. Bei einem bilinearen Filter also schonmal 2x2 Texel, bei anisotropischen Filtern oder bei MipMap-Verwendung u.U. sehr viel mehr. SEHR viel mehr.

Ich habe das in meinem Framework dann so gelöst, dass ich anhand des Verhältnisses zwischen Zielgröße auf dem Bildschirm und Quellgröße des Texturausschnitts eine maximale Filtergröße der GPU abgeschätzt habe und die benutzten Texturkoordinaten im Pixelshader dann um diesen Abstand nach innen begrenzt. Das hat prima funktioniert, und ich habe auch schon irgendwo hier im Forum Beispiel-Shadercode dafür gepostet, aber ich finde den gerade nicht wieder.

Achja, und achte darauf, dass die GPU subpixelgenau rendert. Wenn Du eine Grafik wirklich pixelexakt platzieren willst, dann platziere die Vertices genau auf den Kanten der Zielpixel.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

23.11.2013, 14:20

Was ich vergessen hatte zu erwähnen: Das ganze passiert in 3D. Ich wüsste nicht, wie ich da die Vertices Pixelgenau ausrichten sollte.


Du kannst zum Einen die Texturfilter abschalten. Also "Point" in allen Filterparametern. Das solltest Du auch tun, um zumindest die Grundfehler auszumerzen.

Das Problem trat auch mit Point auf, wenn ich zu nah oder zu weit weg gezoomt hatte.

Hier hilft ein minimales Offset in die richtige Richtung, also z.B. 10^-6 vom Wunsch-Texturausschnitt gesehen nach innen.

Hat mir die Artefakte restlos beseitigt. Vielen Dank für diese Idee :)

EDIT:
Hab mir mal die Mühe gemacht Schrompfs Beitrag rauszusuchen falls mal jemand über die Suche hierüber stolpert: DirectX: Viele Instanzen des gleichen Meshes rendern - wie?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sylence« (23.11.2013, 14:27)


Werbeanzeige

Ähnliche Themen