Compare commits

...

24 commits

Author SHA1 Message Date
Marat Tanalin
54db3496fc bsnes-mt 1.3.4 2022-09-05 01:03:15 +03:00
Marat Tanalin
5ca6261f19 Fixed: state-slot number was not shown in status bar
when iterating one by one via hotkeys.
2022-09-05 00:24:35 +03:00
Marat Tanalin
382313a9c8 Readme: shorter building command 2021-06-30 00:35:30 +03:00
Marat Tanalin
c6ddc374c1 Translations: added language names, updated Spanish 2021-05-08 10:19:34 +03:00
KarLKoX-FR
d9400a53d5
Translations: added French translation by KarLKoX-FR 2021-03-01 06:25:01 +03:00
Marat Tanalin
3f5ae24489 README: fixed typo 2021-01-10 06:08:58 +03:00
Marat Tanalin
b5171a69b9 Translations > German: added translation author and bsnes-mt version info
.
2021-01-07 04:04:31 +03:00
Marat Tanalin
4f862c8a14
Translations: added German translation by merging PR #14
from Erendel/feature/german
2021-01-07 03:58:29 +03:00
Marat Tanalin
10866970ad Translations: temporarily deleted German translation 2021-01-07 03:57:14 +03:00
Marat Tanalin
45ebe36126 Translations: added German translation
By Erendel.
2021-01-07 03:49:50 +03:00
Marat Tanalin
e6f1c2c632 Translations: almost full Spanish translation 2021-01-07 03:31:23 +03:00
Erendel
50f814179a Implementation of the feedback of @Marat-Tanalin 2021-01-06 22:42:33 +01:00
Marat Tanalin
fd9d254ed1 Updated README 2021-01-06 16:58:18 +03:00
Erendel
0286e10112 Optimization 2021-01-04 22:51:43 +01:00
Erendel
b747d5a8fc Fixed some typos and the quotation marks 2021-01-04 22:48:25 +01:00
Erendel
d507e56a50 Full German translation of the English strings in "en.txt" 2021-01-04 22:04:44 +01:00
Marat Tanalin
b1ccdcc33b Updated README 2021-01-02 03:44:33 +03:00
Marat Tanalin
8f0e17fdd5 Translations: added partial Spanish translation 2021-01-02 03:12:31 +03:00
Marat Tanalin
7338e093d4 Translations: added full Italian translation
by Vecna.
2020-12-30 17:43:29 +03:00
Marat Tanalin
fdd33342a2 Translations: added author and bsnes-mt version info into translation files 2020-12-30 17:41:42 +03:00
Marat Tanalin
1992ccce5d Translations > Italian: renamed it.txt to it-partial.txt 2020-12-30 17:27:40 +03:00
Marat Tanalin
fd16e42d3a Translations > Japanese: fixed syntax 2020-12-30 01:34:09 +03:00
Marat Tanalin
dbf3d37cb8 Cartridge::load(): removed redundant condition 2020-10-28 14:30:42 +03:00
Marat Tanalin
0c1fa394b8 Moved shaders to a separate repo 2020-10-26 17:59:27 +03:00
138 changed files with 2589 additions and 141102 deletions

View file

@ -12,27 +12,32 @@ See the project [webpage](http://tanalin.com/en/projects/bsnes-mt/) for details.
## Contributing translations
Feel free to contribute user-interface translations. Thats easy even if you are not a programmer.
Feel free to contribute user-interface translations. Thats easy even if you are not a programmer. Translations are regular text files with simple `key="value"` syntax.
The app is already available in English and Russian, and partially Italian and Japanese. English and Russian translations are complete and dont need contributions. The English translation is built into the executable, other translations are loaded from text files when starting the application.
The canonical translation is [English](https://github.com/Marat-Tanalin/bsnes-mt/blob/master/bsnes-mt/translations/en.txt), other translations should be based on it. Partial translations are possible: if a string is not translated, just the original English-language string is automatically used instead.
Each translation is in a text file in the [`bsnes-mt/translations`](https://github.com/Marat-Tanalin/bsnes-mt/blob/master/bsnes-mt/translations) folder. The files use the UTF-8 character encoding. The files are named according to two-letter codes defined in the ISO 639-1 standard:
The app comes with multiple translations. The default English translation is built into the executable, other translations are loaded dynamically from text files when starting the application. The English and Russian translations are complete and dont need contributions.
Each translation is in a text file in the [`bsnes-mt/translations`](https://github.com/Marat-Tanalin/bsnes-mt/blob/master/bsnes-mt/translations) folder. The files use the UTF-8 character encoding. The files have lowercase names and are named according to two-letter language codes defined in the [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) standard with optional subtags according to [BCP 47](https://tools.ietf.org/html/bcp47), for example:
* `en.txt` for English;
* `ru.txt` for Russian;
* `it.txt` for Italian;
* `ja.txt` for Japanese.
Partial translations are possible: if a string is not translated, just the original English-language string is automatically used instead.
* `pt-br.txt` for Brazilian Portuguese.
Start with translating menus (`Menu.*`), then settings (`Settings.*`) and common strings (`Common.*`) — they form the main part of the user interface.
Dont bother translating `Browser.*` strings — they are related to non-native file dialogs that are disabled by default and going to be removed from both bsnes and bsnes-mt.
Please ignore capitalization (uppercased first letter of each word) and dont try to maintain it when translating. For example, translate “Open **R**ecent **G**ame” as if it was “Open **r**ecent **g**ame” with lowercase “r” and “g”.
The “|” character in strings is a placeholder meant to be replaced with a number or word(s) — dont capitalize words after that character.
## How to compile/build
[Install MinGW](https://github.com/orlp/dev-on-windows/wiki/Installing-GCC--&-MSYS2), then execute the following command inside the folder with bsnes-mt source code:
```
mingw32-make -C bsnes target=bsnes
mingw32-make -C bsnes
```
Like original bsnes, bsnes-mt cannot be built with Visual Studio for now.

View file

@ -14,8 +14,11 @@ static const uint8_t quickStatesNumber = 25;
static const uint8_t recentGamesNumber = 25;
static const string title = "bsnes-mt";
static const string version = "1.3.3";
static const string copyYear = u8"© 2020";
static const string version = "1.3.4";
static const string copyYearA = u8"© 2020";
static const string copyYearB = "2022";
static const string copyDashEn = u8"";
static const string copyDashRu = u8"";
static const string authorEn = "Marat Tanalin";
static const string authorRu = u8"Марат Таналин";
static const string urlRoot = "http://tanalin.com";
@ -46,7 +49,7 @@ static const string infoEn = u8"Improved version of bsnes:\n\n" +
bullet + u8"multilanguage user interface;\n" +
bullet + u8"built-in hotkeys for common actions;\n" +
bullet + u8"and more.\n\n" +
copyYear + space + authorEn + "\n" + pageLinkEn;
copyYearA + copyDashEn + copyYearB + space + authorEn + "\n" + pageLinkEn;
static const string infoRu = u8"Улучшенная версия bsnes:\n\n" +
bullet + linkStartTagStart + articleUrlRu + linkStartTagEnd +
@ -56,7 +59,7 @@ static const string infoRu = u8"Улучшенная версия bsnes:\n\n" +
bullet + u8"многоязычный пользовательский интерфейс;\n" +
bullet + u8"встроенные горячие клавиши для частых действий;\n" +
bullet + u8"и многое другое.\n\n" +
copyYear + space + authorRu + "\n" + pageLinkRu;
copyYearA + copyDashRu + copyYearB + space + authorRu + "\n" + pageLinkRu;
static const string windowTitle = title + space + version;

View file

@ -0,0 +1,622 @@
Translation.language = "German"
Translation.author = "Erendel"
Translation.version = "1.3.3"
Common.Yes = "Ja"
Common.No = "Nein"
Common.Cancel = "Abbrechen"
Common.Always = "Immer"
Common.AreYouSure = "Sind Sie sicher?"
Common.Open = "Öffnen"
Common.Load = "Laden"
Common.Save = "Speichern"
Common.Add = "Hinzufügen"
Common.Remove = "Entfernen"
Common.Delete = "Löschen"
Common.Rename = "Umbenennen"
Common.Reset = "Zurücksetzen"
Common.Clear = "Leeren"
Common.None = "Kein"
Common.Disabled = "Deaktiviert"
Common.Default = "Standard"
Common.Name = "Name"
Common.Date = "Datum"
Common.Success = "Erfolg"
Common.Failure = "Fehlschlag"
Common.Error = "Fehler"
Common.Warning = "Warnung"
Common.Auto = "Auto"
Common.Video = "Video"
Common.Audio = "Audio"
Common.Fps = "fps"
Common.Hz = "Hz"
Common.number = "#"
Menu.File = "Datei"
Menu.File.OpenGame = "Spiel öffnen"
Menu.File.OpenRecentGame = "Zuletzt gespieltes Spiel öffnen"
Menu.File.OpenRecentGame.ClearList = "Liste leeren"
Menu.File.OpenRecentGame.ClearList.confirm.title = "Die Liste zuletzt gespielter Spiele leeren?"
Menu.File.OpenRecentGame.ClearList.confirm = "Sind Sie sicher, dass sie die Liste zuletzt gespielter Spiele leeren möchten?"
Menu.File.OpenRecentGame.NoRecentGames = "Keine zuletzt gespielten Spiele"
Menu.File.CloseGame = "Spiel schließen"
Menu.File.Exit = "Verlassen"
Menu.System = "System"
Menu.System.ControllerPort = "Kontrolleranschluss"
Menu.System.ExpansionPort = "Erweiterungsanschluss"
Menu.Settings.Size = "Größe"
Menu.Settings.Size.ShrinkWindowToSize = "Fenster auf Größe verkleinern"
Menu.Settings.Size.CenterWindow = "Fenster zentrieren"
Menu.Settings.Size.FullScreenMode = "Vollbildmodus"
Menu.Settings.Size.PseudoFullScreenMode = "Pseudo-Vollbildmodus"
Menu.Settings.Output = "Ausgabe"
Menu.Settings.Output.Center = "Zentriert"
Menu.Settings.Output.PixelPerfect = "Pixelgenau"
Menu.Settings.Output.Scale = "Skaliert"
Menu.Settings.Output.Stretch = "Gestreckt"
Menu.Settings.Output.AspectRatioCorrection = "Korrektur des Seitenverhältnisses"
Menu.Settings.Output.parInsteadOfAr = "8:7 PAR anstatt 4:3 AR"
Menu.Settings.Output.ShowOverscanArea = "Overscanbereich anzeigen"
Menu.Settings.Output.scalingInfo = "Skalierungsinformationen in der Statusleiste"
Menu.Settings.Output.HiresBlurEmulation = "Hochauflösende Unschärfeemulation"
Menu.Settings.Filter = "Filter"
Menu.Settings.Shader = "Shader"
Menu.Settings.Shader.Blur = "Unschärfe"
Menu.Settings.MuteAudio = "Audio stummschalten"
Menu.Settings.ShowStatusBar = "Statusleiste anzeigen"
Menu.Settings.OpenSettingsFolder = "Einstellungsordner öffnen"
Menu.Help = "Hilfe"
Menu.Help.About = "Über |"
Settings = "Einstellungen"
Settings.Common.Assign = "Zuweisen"
Settings.Common.AssignLowercase = "zuweisen"
Settings.Common.Mapping = "Belegung"
Settings.Common.MappingAssigned = "Belegung zugewiesen."
Settings.Common.PressKeyOrButtonForMapping = "Taste oder Knopf für Belegung drücken"
Settings.Common.FrameLowercase = "Bild"
Settings.Video.ColorAdjustment = "Farbanpassung"
Settings.Video.Luminance = "Leuchtstärke"
Settings.Video.Saturation = "Sättigung"
Settings.Video.Gamma = "Gamma"
Settings.Video.DimVideoWhenIdle = "Video abdunkeln, wenn untätig"
Settings.Video.DimVideoWhenIdle.tooltip = "Dunkelt das Videosignal ab, um anzuzeigen, dass die Emulation nicht läuft."
Settings.Video.DrawSnowEffectWhenIdle = "Schneeeffekt anzeigen, wenn untätig"
Settings.Audio.Effects = "Effekte"
Settings.Audio.Skew = "Versatz"
Settings.Audio.Skew.tooltip = "
Passt die Audiofrequenz um den Versatzwert an (in Hz).
Dies ist im Wesentlichen eine statische Ratensteuerung.
Aktivieren Sie zunächst sowohl die Video- als auch die Audiosynchronisation.
Erhöhen oder senken Sie dann diesen Wert, um zu versuchen, Fehler zu reduzieren.
Eine Richtung wird Video helfen, aber Audio schaden.
Die andere Richtung wird das Gegenteil bewirken.
Die Idee ist, den besten Mittelweg zu finden.
Sie sollten diesen Wert auf 0 belassen, wenn Sie die dynamische Ratensteuerung verwenden.
"
Settings.Audio.Volume = "Lautstärke"
Settings.Audio.Volume.tooltip = "
Passt die Lautstärke der Audioausgabe an.
Sie sollten, wenn möglich, keine Werte über 100% verwenden!
Wenn Sie dies tun, können Audioschnittverzerrungen auftreten.
"
Settings.Audio.Balance = "Balance"
Settings.Audio.Balance.tooltip = "
Verschiebt die Audioausgabe nach links (niedrigere Werte) oder rechts (höhere Werte).
50% (zentriert) ist die empfohlene Einstellung.
"
Settings.Audio.MuteWhenUnfocused = "Stummschalten, wenn nicht im Vordergrund"
Settings.Input = "Eingabe"
Settings.Input.WhenFocusIsLost = "Wenn nicht im Vordergrund"
Settings.Input.WhenFocusIsLost.PauseEmulation = "Emulation pausieren"
Settings.Input.WhenFocusIsLost.BlockInput = "Eingabe blockieren"
Settings.Input.WhenFocusIsLost.AllowInput = "Eingabe erlauben"
Settings.Input.Port = "Anschluss"
Settings.Input.Device = "Gerät"
Settings.Input.TurboRate = "Turborate"
Settings.Input.TurboRate.tooltip = "Anzahl der Bilder, die zwischen dem Umschalten der Turbotasten gewartet werden soll."
Settings.Input.MouseLeft = "Linke Maustaste"
Settings.Input.MouseMiddle = "Mittlere Maustaste"
Settings.Input.MouseRight = "Rechte Maustaste"
Settings.Input.MouseXAxis = "X-Achse der Maus"
Settings.Input.MouseYAxis = "Y-Achse der Maus"
Settings.Hotkeys = "Tastenkürzel"
Settings.Hotkeys.CombinationalLogic = "Kombinatorische Logik"
Settings.Hotkeys.CombinationalLogic.tooltip = "
Legt fest, ob alle oder nur bestimmte Belegungen gedrückt werden müssen, um Tastaturkürzel zu aktivieren.
Verwenden Sie die “UND”-Logik, wenn Sie möchten, dass Tastenkombinationen wie Strg+F einen Tastenkürzel auslösen.
Verwenden Sie die “ODER”-Logik, wenn Sie möchten, dass sowohl eine Tastatur als auch ein Gamepad denselben Hotkey auslösen.
"
Settings.Hotkeys.CombinationalLogic.And = "UND"
Settings.Hotkeys.CombinationalLogic.And.tooltip = "Jede Belegung muss gedrückt werden, um einen bestimmten Tastenkürzel zu aktivieren."
Settings.Hotkeys.CombinationalLogic.Or = "ODER"
Settings.Hotkeys.CombinationalLogic.Or.tooltip = "Jede Belegung kann gedrückt werden, um einen bestimmten Hotkey zu aktivieren."
Settings.Hotkeys.Rewind.enableFirst = "Bitte aktivieren Sie zunächst die Zurückspulunterstützung unter “Einstellungen” → “Emulator”."
Settings.BuiltinHotkeys = "Tastenkürzel (eingebaut)"
Settings.Paths = "Pfade"
Settings.Paths.Games = "Spiele"
Settings.Paths.Patches = "Patches"
Settings.Paths.Saves = "Speicherstände"
Settings.Paths.Cheats = "Cheats"
Settings.Paths.States = "Zwischenstände"
Settings.Paths.Screenshots = "Screenshots"
Settings.Paths.LastRecentlyUsed = "zuletzt verwendet"
Settings.Paths.SameAsLoadedGame = "derselbe, wie das geladene Spiel"
Settings.Emulator = "Emulator"
Settings.Emulator.General = "Allgemein"
Settings.Emulator.General.warnOnUnverifiedGames = "Warnen, wenn Spiele geöffnet werden, die nicht verifiziert wurden"
Settings.Emulator.General.autoSaveMemory = "Speicher periodisch sichern"
Settings.Emulator.General.autoSaveStateOnUnload = "Zwischenstand speichern, wenn Spiele entladen werden"
Settings.Emulator.General.AutoResumeOnLoad = "Beim Laden fortsetzen"
Settings.Emulator.General.UseNativeFileDialogs = "Native Dateidialoge verwenden"
Settings.Emulator.FastForward = "Vorspulen"
Settings.Emulator.FastForward.FrameSkip = "Bildüberspringung"
Settings.Emulator.FastForward.FrameSkip.tooltip = "
Legt fest, wie viele Bilder beim Vorspulen übersprungen werden sollen.
Das Überspringen von Einzelbildern ermöglicht eine höhere maximale Bildrate beim Vorspulen.
"
Settings.Emulator.FastForward.FrameSkip.Frames2to4 = "| Bilder"
Settings.Emulator.FastForward.FrameSkip.Frames = "| Bilder"
Settings.Emulator.FastForward.Limiter = "Begrenzer"
Settings.Emulator.FastForward.Limiter.tooltip = "Legt die Maximalgeschwindigkeit beim Vorspulen fest."
Settings.Emulator.FastForward.mute = "Beim Vorspulen stummschalten"
Settings.Emulator.Rewind = "Zurückspulen"
Settings.Emulator.Rewind.Frequency = "Frequenz"
Settings.Emulator.Rewind.Frequency.everyFrames = "Alle | Bilder"
Settings.Emulator.Rewind.Length = "Länge"
Settings.Emulator.Rewind.Length.states = "| Zwischenstände"
Settings.Emulator.Rewind.mute = "Beim zurückspulen stummschalten"
Settings.Enhancements = "Verbesserungen"
Settings.Enhancements.FastMode = "Schneller Modus"
Settings.Enhancements.RunAhead = "Vorlauf"
Settings.Enhancements.RunAhead.Frames = "Bilder"
Settings.Enhancements.RunAhead.One = "Ein"
Settings.Enhancements.RunAhead.Two = "Zwei"
Settings.Enhancements.RunAhead.Three = "Drei"
Settings.Enhancements.RunAhead.Four = "Vier"
Settings.Enhancements.Overclocking = "Übertaktung"
Settings.Enhancements.Ppu.Video = "Video"
Settings.Enhancements.Ppu.Deinterlace = "Deinterlace"
Settings.Enhancements.Ppu.NoSpriteLimit = "Kein Sprite-Limit"
Settings.Enhancements.hdMode7.FastPpuOnly = "nur schnelle PPU"
Settings.Enhancements.hdMode7.Scale = "Skalierung"
Settings.Enhancements.hdMode7.PerspectiveCorrection = "Perspektivenkorrektur"
Settings.Enhancements.hdMode7.Supersampling = "Supersampling"
Settings.Enhancements.hdMode7.HdToSdMosaic = "HD→SD Mosaik"
Settings.Enhancements.Dsp.Audio = "Audio"
Settings.Enhancements.Dsp.CubicInterpolation = "Kubische Interpolation"
Settings.Enhancements.Coprocessors = "Koprozessoren"
Settings.Enhancements.Coprocessors.PreferHle = "High-Level-Emulation (HLE) bevorzugen"
Settings.Enhancements.Coprocessors.PreferHle.tooltip = "
Wenn aktiviert, wird die weniger genaue HLE-Emulation immer verwendet, wenn sie verfügbar ist.
Wenn nicht aktiviert, wird HLE nur verwendet, wenn keine Firmware mit Low-Level-Emulation (LLE) vorhanden ist.
"
Settings.Enhancements.GameEnhancements = "Spielverbesserungen"
Settings.Enhancements.GameEnhancements.Hotfixes = "Hotfixes"
Settings.Enhancements.GameEnhancements.Hotfixes.tooltip = "
Auch kommerziell lizenzierte und offiziell veröffentlichte Software wird manchmal mit Fehlern ausgeliefert.
Mit dieser Option werden bestimmte Probleme behoben, die auch auf echter Hardware aufgetreten sind.
"
Settings.Compatibility = "Kompatibilität"
Settings.Compatibility.entropy = "Entropie (Randomisierung)"
Settings.Compatibility.entropy.None.tooltip = "
Alle Speicher und Register werden beim Start auf konstante Werte initialisiert.
Verwenden Sie dies für die Kompatibilität mit sehr alten Demoszene-Homebrew-Spielen.
"
Settings.Compatibility.entropy.Low = "Niedrig"
Settings.Compatibility.entropy.Low.tooltip = "
Der gesamte Speicher wird mit sich wiederholenden Mustern randomisiert, alle Register werden beim Starten randomisiert.
Verwenden Sie dies für die genaueste Repräsentation eines echten SNES.
"
Settings.Compatibility.entropy.High = "Hoch"
Settings.Compatibility.entropy.High.tooltip = "
Alle Speicher und Register sind so weit wie möglich randomisiert.
Verwenden Sie dies bei der Entwicklung neuer SNES-Software, um eine
maximale Kompatibilität mit echter Hardware zu gewährleisten.
"
Settings.Compatibility.cpu.Processor = "Prozessor"
Settings.Compatibility.cpu.FastMath = "Schnelles Rechnen"
Settings.Compatibility.cpu.FastMath.tooltip = "
CPU-Multiplikation und -Division benötigen Zeit, um auf einem echten SNES abgeschlossen zu werden.
Ältere Emulatoren haben diese Verzögerungen nicht simuliert und lieferten sofort Ergebnisse.
Einige ältere ROM-Hacks warten nicht auf den Abschluss von mathematischen Operationen und benötigen diesen Hack.
"
Settings.Compatibility.ppu.Video = "Video"
Settings.Compatibility.ppu.NoVramBlocking = "Keine Blockierung des Videospeichers (VRAM)"
Settings.Compatibility.ppu.NoVramBlocking.tooltip = "
Mit dieser Option kann ein Fehler in älteren Versionen von ZSNES und Snes9x emuliert werden, bei dem die VRAM-Blockierung nicht emuliert wurde.
Einige ältere ROM-Hacks haben sich auf dieses Verhalten verlassen und stellen Grafiken falsch dar, wenn dies nicht aktiviert ist.
Dies ist nicht nur extrem ungenau gegenüber echter Hardware, es schadet auch der Geschwindigkeit der schnellen PPU.
Aktivieren Sie diese Option nicht, es sei denn, Sie müssen ein Spiel spielen, das sonst nicht korrekt funktioniert.
"
Settings.Compatibility.dsp.Audio = "Audio"
Settings.Compatibility.dsp.EchoShadowRam = "Echo-Schatten-RAM"
Settings.Compatibility.dsp.EchoShadowRam.tooltip = "
Diese Option ermöglicht die Emulation eines Fehlers in ZSNES, bei dem das Echo-RAM als getrennt vom APU-RAM behandelt wurde.
Viele ältere ROM-Hacks für “Super Mario World” verließen sich auf dieses Verhalten und stürzen ohne Aktivierung dieser Option ab.
Es ist jedoch extrem ungenau gegenüber echter Hardware und sollte nicht aktiviert werden, wenn es nicht erforderlich ist.
"
Settings.Drivers = "Treiber"
Settings.Drivers.Driver = "Treiber"
Settings.Drivers.Change = "Wechseln"
Settings.Drivers.Reload = "Neu laden"
Settings.Drivers.ExclusiveMode = "Exklusiver Modus"
Settings.Drivers.Synchronize = "Synchronisieren"
Settings.Drivers.ActiveDriver = "Aktiver Treiber"
Settings.Drivers.changeConfirm.title = "Treiber wechseln?"
Settings.Drivers.changeConfirm = "
Warnung: Inkompatible Treiber können die Anwendung zum Absturz bringen.
Es wird dringend empfohlen, dass Sie Ihr Spiel zur Sicherheit zuerst entladen.
Möchten Sie jetzt trotzdem mit dem Treiberwechsel fortfahren?
"
Settings.noteGameRestart = "Hinweis: Einige Einstellungen werden erst beim erneuten Laden des Spiels wirksam."
Settings.Drivers.Video.failedToInitialize = "Initialisierung des [|]-Videotreibers fehlgeschlagen"
Settings.Drivers.Video.FullScreenMonitor = "Vollbild-Monitor"
Settings.Drivers.Video.FullScreenMonitor.tooltip = "Legt fest, an welchen Monitor das Videosignal im Vollbildmodus gesendet wird."
Settings.Drivers.Video.Format = "Format"
Settings.Drivers.Video.ExclusiveMode.tooltip = "
Bewirkt, dass der Vollbildmodus alle Monitore übernimmt.
Dadurch funktioniert die adaptive Synchronisierung besser und die Eingabeverzögerung wird verringert.
Benutzer, die mehrere Monitore verwenden, sollten diese Option jedoch deaktivieren.
Hinweis: Der Direct3D-Exklusivmodus beachtet auch nicht den gewünschten Monitor.
"
Settings.Drivers.Video.Synchronize.tooltip = "
Wartet, bis die Grafikkarte bereit ist, bevor Einzelbilder gerendert werden.
Eliminiert ausgelassene oder doppelte Einzelbilder, kann aber das Audiosignal verzerren.
Mit dieser Option wird empfohlen, die Audiosynchronisation zu deaktivieren,
und die dynamische Ratensteuerung zu aktivieren. Oder passen Sie alternativ
die Option “Audioversatz” an, um Pufferunter-/-überläufe zu reduzieren.
"
Settings.Drivers.Video.GpuSync = "GPU-Synchronisation"
Settings.Drivers.Video.GpuSync.tooltip = "
(Nur OpenGL-Treiber)
Bewirkt, dass die GPU wartet, bis Frames vollständig gerendert sind.
Im besten Fall kann dies bis zu einem Einzelbild bei der Eingabeverzögerung beseitigen.
Allerdings ist dies mit einem Leistungsverlust von etwa 20% verbunden.
Sie sollten diese Option deaktivieren, wenn Sie es nicht für notwendig halten.
"
Settings.Drivers.Audio.failedToInitialize = "Initialisierung des [|]-Audiotreibers fehlgeschlagen"
Settings.Drivers.Audio.OutputDevice = "Ausgabegerät"
Settings.Drivers.Audio.SampleRate = "Abtastrate"
Settings.Drivers.Audio.Latency = "Verzögerung"
Settings.Drivers.Audio.ExclusiveMode.tooltip = "
(Nur WASAPI-Treiber)
Übernimmt die exklusive Kontrolle über das Soundkartengerät.
Dies kann die Audioverzögerung erheblich reduzieren.
Allerdings werden dadurch Töne von allen anderen Anwendungen blockiert.
"
Settings.Drivers.Audio.Synchronize.tooltip = "
Wartet, bis die Soundkarte bereit ist, bevor Samples ausgegeben werden.
Eliminiert Audioverzerrungen, kann aber das Videosignal verzerren.
Mit dieser Option wird empfohlen, die Videosynchronisation zu deaktivieren.
Die besten Ergebnisse erzielen Sie, wenn Sie diese Option mit einem adaptiven Sync-Monitor verwenden.
"
Settings.Drivers.Audio.DynamicRate = "Dynamische Rate"
Settings.Drivers.Audio.DynamicRate.tooltip = "
(Nur OSS-, XAudio2-, waveOut-Treiber)
Passt die Audiofrequenz dynamisch um kleine Beträge an.
Verwenden Sie dies mit aktivierter Bildsynchronisation und deaktivierter Audiosynchronisation.
Dies kann perfektes, flüssiges Video und sauberes Audio erzeugen,
aber nur, wenn die Bildwiederholfrequenz Ihres Monitors richtig eingestellt ist:
60 Hz für NTSC-Spiele und 50 Hz für PAL-Spiele.
"
Settings.Drivers.Input.failedToInitialize = "Initialisierung des [|]-Eingabetreibers fehlgeschlagen"
Settings.Drivers.Input.Reload.tooltip = "
Ein Treiber-Neuladen kann verwendet werden, um Hotplugged-Geräte zu erkennen.
Dies ist nützlich für APIs, die keine Auto-Hotplug-Unterstützung bieten,
wie z. B. DirectInput und SDL.
"
Settings.Drivers.syncModePresets = "Voreinstellungen für den Synchronisationsmodus"
Settings.Drivers.syncModePresets.requirements = "
Adaptive Synchronisation: Erfordert einen G-Sync- oder FreeSync-Monitor.
Dynamische Ratensteuerung: Erfordert die Übereinstimmung der Bildwiederholraten von Monitor und SNES.
"
Settings.Drivers.syncModePresets.AdaptiveSync = "Adaptive Synchronisation"
Settings.Drivers.syncModePresets.AdaptiveSync.failure = "
Die aktuelle Treiberkonfiguration ist leider nicht mit dem adaptiven Synchronisationsmodus kompatibel.
Adaptive Synchronisation erfordert die Unterstützung der Audiosynchronisation.
"
Settings.Drivers.syncModePresets.AdaptiveSync.success = "
Adaptive Synchronisation funktioniert am besten im exklusiven Vollbildmodus.
Verwenden Sie die niedrigste Audioverzögerungseinstellung, die Ihr System bewältigen kann.
Ein G-Sync- oder FreeSync-Monitor ist erforderlich.
Adaptive Synchronisation muss in Ihrem Treibereinstellungsmenü aktiviert sein.
"
Settings.Drivers.syncModePresets.DynamicRateControl = "Dynamische Ratensteuerung"
Settings.Drivers.syncModePresets.DynamicRateControl.failure = "
Die aktuelle Treiberkonfiguration ist leider nicht mit dem Modus “Dynamische Ratensteuerung” kompatibel.
Die dynamische Ratensteuerung erfordert eine Videosynchronisation und die Unterstützung von dynamischen Audioraten.
"
Settings.Drivers.syncModePresets.DynamicRateControl.success = "
Die dynamische Ratensteuerung erfordert, dass Ihr Monitor mit folgenden Bildfrequenzen läuft:
60 Hz für NTSC-Spiele, 50 Hz für PAL-Spiele.
Verwenden Sie die niedrigste Audioverzögerungseinstellung, die Ihr System bewältigen kann.
"
Settings.BuiltinHotkeys.CheckAll = "Alle auswählen"
Settings.BuiltinHotkeys.UncheckAll = "Alle abwählen"
Tools = "Werkzeuge"
Tools.SaveState = "Speichere Zwischenstand"
Tools.SaveState.Slot = "Platz"
Tools.SaveState.Slot.Empty = "leer"
Tools.LoadState = "Lade Zwischenstand"
Tools.LoadState.SelectedStateSlot = "Ausgewählter Zwischenstands-Platz"
Tools.LoadState.UndoLastSave = "Letzte Speicherung rückgängig machen"
Tools.LoadState.RedoLastUndo = "Letztes Rückgängigmachen wiederholen"
Tools.LoadState.RemoveAllStates = "Alle Zwischenstände entfernen"
Tools.LoadState.RemoveAllStates.confirm.title = "Schnelle Zwischenstände entfernen?"
Tools.LoadState.RemoveAllStates.confirm = "Sind Sie sicher, dass Sie alle schnellen Zwischenstände für dieses Spiel dauerhaft entfernen möchten?"
Tools.Speed = "Geschwindigkeit"
Tools.Speed.Slowest = "Am langsamsten"
Tools.Speed.Slow = "Langsam"
Tools.Speed.Normal = "Normal"
Tools.Speed.Fast = "Schnell"
Tools.Speed.Fastest = "Am schnellsten"
Tools.RunMode = "Betriebsmodus"
Tools.RunMode.Normal = "Normal"
Tools.RunMode.PauseEmulation = "Emulation pausieren"
Tools.RunMode.FrameAdvance = "Einzelbildvorlauf"
Tools.Movie = "Film"
Tools.Movie.Play = "Abspielen"
Tools.Movie.Record = "Aufnehmen"
Tools.Movie.ResetAndRecord = "Zurücksetzen und aufnehmen"
Tools.Movie.Stop = "Anhalten"
Tools.TakeScreenshot = "Screenshot aufnehmen"
Tools.CheatFinder = "Cheat-Finder"
Tools.CheatFinder.Address = "Addresse"
Tools.CheatFinder.Value = "Wert"
Tools.CheatFinder.Scan = "Suche"
Tools.CheatFinder.All = "Alle"
Tools.CheatEditor = "Cheat-Editor"
Tools.CheatEditor.remove.confirm.title = "Cheat(s) entfernen?"
Tools.CheatEditor.remove.confirm = "Sind Sie sicher, dass Sie den/die ausgewählten Cheat(s) dauerhaft entfernen möchten?"
Tools.CheatEditor.Codes = "Code(s)"
Tools.CheatEditor.Enable = "Aktivieren"
Tools.CheatEditor.SelectAll = "Alle auswählen"
Tools.CheatEditor.UnselectAll = "Alle abwählen"
Tools.CheatEditor.AddCheats = "Cheats hinzufügen"
Tools.CheatEditor.AddCheat = "Cheat hinzufügen"
Tools.CheatEditor.EditCheat = "Cheat bearbeiten"
Tools.CheatEditor.Edit = "Bearbeiten"
Tools.CheatEditor.FindCheats = "Cheats finden"
Tools.CheatEditor.noCheats = "Es wurden leider keine Cheats für dieses Spiel gefunden."
Tools.CheatEditor.EnableCheats = "Cheats aktivieren"
Tools.CheatEditor.EnableCheats.tooltip = "
Master-Aktivierung für alle Cheat-Codes.
Wenn diese Option nicht aktiviert ist, sind keine Cheat-Codes aktiv.
Verwenden Sie dies, um Spielbereiche zu umgehen, die Probleme mit Cheats haben.
"
Tools.CheatEditor.EnableCheats.disabled = "Alle Cheat-Codes sind deaktiviert"
Tools.CheatEditor.EnableCheats.enabled = "Aktive Cheat-Codes sind aktiviert"
Tools.CheatEditor.invalidFormat = "Ungültige(r) Code(s), bitte nur Codes in folgendem Format verwenden"
Tools.StateManager = "Zwischenstandsverwaltung"
Tools.StateManager.Category = "Kategorie"
Tools.StateManager.Category.ManagedStates = "Verwaltete Zwischenstände"
Tools.StateManager.Category.QuickStates = "Schnelle Zwischenstände"
Tools.StateManager.QuickStates.Redo = "Wiederholen"
Tools.StateManager.QuickStates.Undo = "Rückgängig"
Tools.StateManager.Preview = "Vorschau"
Tools.StateManager.AddState = "Zwischenstand hinzufügen"
Tools.StateManager.RenameState = "Zwischenstand umbenennen"
Tools.StateManager.remove.confirm.title = "Zwischenstand/-stände entfernen?"
Tools.StateManager.remove.confirm = "Sind Sie sicher, dass Sie den/die ausgewählten Zwischenstand/-stände dauerhaft entfernen möchten?"
Tools.ManifestViewer = "Manifest-Betrachter"
Tools.ManifestViewer.Manifest = "Manifest"
Game.VerifiedGameOpened = "Geprüftes Spiel geöffnet"
Game.GameOpened = "Spiel geöffnet"
Game.GameClosed = "Spiel geschlossen"
Game.GameReset = "Spiel zurückgesetzt"
Game.AndPatchApplied = " und Patch angewendet"
Game.GameOpeningCancelled = "Öffnen des Spiels abgebrochen"
Game.unverifiedGameWarning.title = "Ungeprüftes Abbild des Spiel"
Game.unverifiedGameWarning = "
Warnung: Dieses Spielabbild ist nicht geprüft.
Die Ausführung *kann* ein Sicherheitsrisiko darstellen.
Möchten Sie das Spiel trotzdem ausführen?
"
Game.unverifiedGameWarning.alwaysQuestion.title = "Warnung deaktivieren?"
Game.unverifiedGameWarning.alwaysQuestion = "Möchten Sie die Warnung, wenn Sie versuchen, nicht verifizierte Spiele auszuführen, deaktivieren?"
Program.Paused = "Pausiert"
Program.Unloaded = "Entladen"
Program.CapturedScreenshot = "Screenshot aufgenommen"
Program.Open.MissingRequiredData = "Erforderliche Daten fehlen"
Program.Load.LoadGameBoyRom = "Game Boy ROM laden"
Program.Load.GameBoyRoms = "Game Boy ROMs"
Program.Load.LoadBsMemoryRom = "BS-Speicher ROM laden"
Program.Load.BsMemoryRoms = "BS-Speicher ROMs"
Program.Load.LoadSufamiTurboRomSlot = "Sufami Turbo ROM - Platz laden"
Program.Load.SufamiTurboRoms = "Sufami Turbo ROMs"
About.Version = "Version"
About.Copyright = "Copyright"
About.License = "Lizenz"
About.Website = "Webseite"
About.SameBoy.description = "Super Game Boy Emulator"
About.Bsnes.description = "Super Nintendo Emulator"
About.Bsnes.copyright = "byuu et al"
About.Bsnes.license = "GPLv3 oder neuer"
Browser.OpenSnesRom = "SNES ROM öffnen"
Browser.SnesRoms = "SNES ROMs"
Browser.AllFiles = "Alle Dateien"
Browser.Select = "Auswählen"
Browser.SelectFolder = "Ordner auswählen"
Browser.ChooseFolder = "Wähle einen Ordner aus"
Browser.ShowHidden = "Versteckte Dateien anzeigen"
Browser.OpenFile = "Datei öffnen"
Browser.OpenFiles = "Dateien öffnen"
Browser.OpenFolder = "Ordner öffnen"
Browser.OpenObject = "Objekt öffnen"
Browser.Rename.EnterNewFolderName = "Geben Sie den neuen Ordnernamen ein"
Browser.Rename.EnterNewFileName = "Geben Sie den neuen Dateinamen ein"
Browser.Rename.FailedToRenameFolder = "Ordner konnte nicht umbenannt werden."
Browser.Rename.FailedToRenameFile = "Datei konnte nicht umbenannt werden."
Browser.Create = "Erstellen"
Browser.Create.EnterName = "Geben Sie einen Namen ein"
Browser.CreateFolder = "Ordner erstellen"
Browser.CreateFolder.EnterNewFolderName = "Geben Sie einen Namen für den neuen Ordner ein"
Browser.Delete.DeleteSelected = "Auswahl löschen"
Browser.Delete.FailedToDelete = "| konnte nicht gelöscht werden. Weiter versuchen, die verbleibenden Elemente zu entfernen?"
Browser.Delete.confirm = "Sind Sie sicher, dass Sie das/die | permanent löschen wollen"
Browser.Delete.confirm.item = "ausgewählte Element"
Browser.Delete.confirm.items = "ausgewählten Elemente"
Browser.SaveFile = "Datei speichern"
Browser.SaveFile.fileExists.title = "Datei überschreiben?"
Browser.SaveFile.fileExists = "Datei existiert bereits. Soll sie überschrieben werden?"
StatusIcon.verifiedRom.tooltip = "
Dies ist ein bekanntes, sauberes Spielabbild.
Die PCB-Emulation ist 100% genau.
"
StatusIcon.unverifiedRom.tooltip = "
Es handelt sich nicht um ein geprüftes Spielabbild.
Die PCB-Emulation verlässt sich auf Heuristiken.
"
ResetDrivers.message.title = "Treiber zurücksetzen"
ResetDrivers.message = "
Die Hardware-Treiber wurden gemäß der Kommandozeilenoption `--resetdrivers` zurückgesetzt.
Bitte konfigurieren Sie die Treiber im Fenster “Einstellungen” → “Treiber”, das sich nun öffnet, neu.
"
Rewind.HistoryExhausted = "Rückspulhistorie erschöpft"
States.incompatibleFormat = "[|] hat ein inkompatibles Format"
States.Loaded = "Geladen"
States.NotFound = "[|] nicht gefunden"
States.FailedToSave = "Speicherung von [|] fehlgeschlagen"
States.UnableToWriteToDisk = "[|] konnte nicht auf das Speichermedium geschrieben werden"
States.Saved = "[|] gespeichert"
Patch.ipsWarning = "
(Sie sehen diese Aufforderung, weil IPS ein schreckliches Patch-Dateiformat ist und sich niemand darüber einigen kann, ob SNES-ROMs mit einem Header versehen werden sollten oder nicht.
Bitte erwägen Sie, den Patch-Autor zu bitten, stattdessen BPS-Patches zu verwenden.)
Erwartet dieser IPS-Patch, dass er auf ein Headered-ROM angewendet wird?
Wenn Sie sich nicht sicher sind, versuchen Sie “Nein”, und wenn es nicht funktioniert, versuchen Sie es erneut mit “Ja”.
"
Patch.ensureHeaderless = "Bitte stellen Sie sicher, dass Sie das richtige (headerlose) ROM für diesen Patch verwenden."
Movies.PlayMovie = "Film abspielen"
Movies.Movies = "Filme"
Movies.playbackStarted = "Filmwiedergabe gestartet"
Movies.playbackStopped = "Filmwiedergabe angehalten"
Movies.formatNotSupported = "Das Filmformat wird nicht unterstützt"
Movies.recordingStarted = "Filmaufnahme gestartet"
Movies.SaveMovie = "Film speichern"
Movies.MovieRecorded = "Film aufgenommen"
Movies.MovieNotRecorded = "Film nicht aufgenommen"
Movies.cantRecord = "Film konnte nicht aufgenommen werden"
Devices.Gamepad = "Gamepad"
Devices.Mouse = "Maus"
Hotkeys.ToggleMouseCapture = "Mauseinfangen umschalten"
Hotkeys.ToggleCheatCodes = "Cheat-Codes umschalten"
Hotkeys.Rewind = "Zurückspulen"
Hotkeys.LoadUndoState = "Rückgängig-Zwischenstand laden"
Hotkeys.LoadRedoState = "Wiederholen-Zwischenstand laden"
Hotkeys.DecrementStateSlot = "Zwischenstand-Platz verringern"
Hotkeys.IncrementStateSlot = "Zwischenstand-Platz erhöhen"
Hotkeys.FastForward = "Vorspulen"
Hotkeys.FrameAdvance = "Einzelbildvorlauf"
Hotkeys.DecreaseHDMode7 = "HD Mode 7 verringern"
Hotkeys.IncreaseHDMode7 = "HD Mode 7 erhöhen"
Hotkeys.ToggleSupersampling = "Supersampling umschalten"
Hotkeys.ResetEmulation = "Emulation zurücksetzen"
Hotkeys.QuitEmulator = "Emulator verlassen"

View file

@ -0,0 +1,622 @@
Translation.language = "Spanish"
Translation.author = "Juan Muro Diego (JuanchoES)"
Translation.version = "1.3.3"
Common.Yes = "Sí"
Common.No = "No"
Common.Cancel = "Cancelar"
Common.Always = "Siempre"
Common.AreYouSure = "¿Estás seguro?"
Common.Open = "Abrir"
Common.Load = "Cargar"
Common.Save = "Guardar"
Common.Add = "Añadir"
Common.Remove = "Quitar"
Common.Delete = "Borrar"
Common.Rename = "Renombrar"
Common.Reset = "Reiniciar"
Common.Clear = "Limpiar"
Common.None = "Nada"
Common.Disabled = "Desabilitado"
Common.Default = "Por defecto"
Common.Name = "Nombre"
Common.Date = "Fecha"
Common.Success = "Éxito"
Common.Failure = "Fallo"
Common.Error = "Error"
Common.Warning = "Atención"
Common.Auto = "Automático"
Common.Video = "Vídeo"
Common.Audio = "Audio"
Common.Fps = "fps"
Common.Hz = "Hz"
Common.number = "#"
Menu.File = "Archivo"
Menu.File.OpenGame = "Abrir juego"
Menu.File.OpenRecentGame = "Abrir juego reciente"
Menu.File.OpenRecentGame.ClearList = "Limpiar lista"
Menu.File.OpenRecentGame.ClearList.confirm.title = "¿Limpiar lista de juegos recientes?"
Menu.File.OpenRecentGame.ClearList.confirm = "¿Estás seguro que quieres borrar toda la lista de juegos recientes?"
Menu.File.OpenRecentGame.NoRecentGames = "No hay juegos recientes"
Menu.File.CloseGame = "Cerrar juego"
Menu.File.Exit = "Salir"
Menu.System = "Sistema"
Menu.System.ControllerPort = "Puerto de mando"
Menu.System.ExpansionPort = "Puerto de expansión"
Menu.Settings.Size = "Tamaño"
Menu.Settings.Size.ShrinkWindowToSize = "Ajustar la ventana a la pantalla"
Menu.Settings.Size.CenterWindow = "Centrar ventana"
Menu.Settings.Size.FullScreenMode = "Modo de pantalla completa"
Menu.Settings.Size.PseudoFullScreenMode = "Seudo-modo de pantalla completa"
Menu.Settings.Output = "Salida"
Menu.Settings.Output.Center = "Centrar"
Menu.Settings.Output.PixelPerfect = "Pixel-Perfect"
Menu.Settings.Output.Scale = "Escalar"
Menu.Settings.Output.Stretch = "Estrechar"
Menu.Settings.Output.AspectRatioCorrection = "Relación de aspecto corregida"
Menu.Settings.Output.parInsteadOfAr = "8:7 PAR en vez de 4:3 AR"
Menu.Settings.Output.ShowOverscanArea = "Mostrar area de sobreescaneo"
Menu.Settings.Output.scalingInfo = "Escalar información en la barra de estado"
Menu.Settings.Output.HiresBlurEmulation = "Activar la emulacion de difuminado"
Menu.Settings.Filter = "Filtros"
Menu.Settings.Shader = "Sombreadores"
Menu.Settings.Shader.Blur = "Difuminado"
Menu.Settings.MuteAudio = "Silenciar audio"
Menu.Settings.ShowStatusBar = "Mostrar la barra de estado"
Menu.Settings.OpenSettingsFolder = "Abrir la carpeta de configuración"
Menu.Help = "Ayuda"
Menu.Help.About = "Acerca de |"
Settings = "Ajustes"
Settings.Common.Assign = "Asignar"
Settings.Common.AssignLowercase = "asignar"
Settings.Common.Mapping = "Botón"
Settings.Common.MappingAssigned = "Botón asignado."
Settings.Common.PressKeyOrButtonForMapping = "Presiona una tecla o botón para asignar una acción"
Settings.Common.FrameLowercase = "frame"
Settings.Video.ColorAdjustment = "Ajuste de color"
Settings.Video.Luminance = "Brillo"
Settings.Video.Saturation = "Saturación"
Settings.Video.Gamma = "Gama"
Settings.Video.DimVideoWhenIdle = "Oscurecer pantalla cuando no se esté usando el emulador"
Settings.Video.DimVideoWhenIdle.tooltip = "Oscurece la pantalla para indicar que el emulador no está siendo usado."
Settings.Video.DrawSnowEffectWhenIdle = "Efecto de nieve cuando no se esté usando el emulador"
Settings.Audio.Effects = "Efectos"
Settings.Audio.Skew = "Frecuencia"
_Settings.Audio.Skew.tooltip = "
Adjusts the audio frequency by the skew amount (in Hz).
This is essentially static rate control.
First, enable both video and audio sync.
Then, raise or lower this value to try to reduce errors.
One direction will help video, but hurt audio.
The other direction will do the reverse.
The idea is to find the best middle ground.
You should leave this at 0 when using dynamic rate control.
"
Settings.Audio.Volume = "Volumen"
Settings.Audio.Volume.tooltip = "
Ajusta el volumen de salida.
You should not use values above 100%, if possible!
If you do, audio clipping distortion can occur.
"
Settings.Audio.Balance = "Balance"
_Settings.Audio.Balance.tooltip = "
Pans audio to the left (lower values) or right (higher values).
50% (centered) is the recommended setting.
"
Settings.Audio.MuteWhenUnfocused = "Silenciar cuando el emulador esté minimizado"
Settings.Input = "Mapeado"
Settings.Input.WhenFocusIsLost = "Cuando esté minimizado"
Settings.Input.WhenFocusIsLost.PauseEmulation = "Pausar emulación"
Settings.Input.WhenFocusIsLost.BlockInput = "Bloquear acción"
Settings.Input.WhenFocusIsLost.AllowInput = "Permitir acción"
Settings.Input.Port = "Puerto"
Settings.Input.Device = "Dispositivo"
Settings.Input.TurboRate = "Velocidad del turbo"
Settings.Input.TurboRate.tooltip = "El número de frames de espera entre activar los botones turbo."
Settings.Input.MouseLeft = "Clic izquierdo"
Settings.Input.MouseMiddle = "Boton central"
Settings.Input.MouseRight = "Clic derecho"
Settings.Input.MouseXAxis = "Ratón X-axis"
Settings.Input.MouseYAxis = "Ratón Y-axis"
Settings.Hotkeys = "Teclas de acceso rápido"
Settings.Hotkeys.CombinationalLogic = "Combinación de teclas/botones"
_Settings.Hotkeys.CombinationalLogic.tooltip = "
Determines whether all or any mappings must be pressed to activate hotkeys.
Use “AND” logic if you want keyboard combinations such as Ctrl+F to trigger a hotkey.
Use “OR” logic if you want both a keyboard and joypad to trigger the same hotkey.
"
Settings.Hotkeys.CombinationalLogic.And = "Y"
_Settings.Hotkeys.CombinationalLogic.And.tooltip = "Every mapping must be pressed to activate a given hotkey."
Settings.Hotkeys.CombinationalLogic.Or = "O"
_Settings.Hotkeys.CombinationalLogic.Or.tooltip = "Any mapping can be pressed to activate a given hotkey."
Settings.Hotkeys.Rewind.enableFirst = "Por favor, habilita la opción de rebobinado en “Ajustes” → “Emulador” primero."
Settings.BuiltinHotkeys = "Teclas de acceso rápido (incorporadas)"
Settings.Paths = "Directorios"
Settings.Paths.Games = "Juegos"
Settings.Paths.Patches = "Parches"
Settings.Paths.Saves = "Archivos de guardado"
Settings.Paths.Cheats = "Trucos"
Settings.Paths.States = "Archivos de cargado"
Settings.Paths.Screenshots = "Pantallazos"
Settings.Paths.LastRecentlyUsed = "Usado recientemente"
Settings.Paths.SameAsLoadedGame = "Igual que juego cargado"
Settings.Emulator = "Emulador"
Settings.Emulator.General = "General"
Settings.Emulator.General.warnOnUnverifiedGames = "Advertir cuando se abran juegos que no han sido verificados"
Settings.Emulator.General.autoSaveMemory = "Guardar memoria periódicamente"
Settings.Emulator.General.autoSaveStateOnUnload = "Guardar un archivo de cargado cuando se quita el juego"
Settings.Emulator.General.AutoResumeOnLoad = "Resumir en carga"
Settings.Emulator.General.UseNativeFileDialogs = "Usar dialogos de archivos nativos"
Settings.Emulator.FastForward = "Avance rápido"
Settings.Emulator.FastForward.FrameSkip = "Omitir fotograma"
_Settings.Emulator.FastForward.FrameSkip.tooltip = "
Sets how many frames to skip while fast forwarding.
Frame skipping allows a higher maximum fast forwarding frame rate.
"
Settings.Emulator.FastForward.FrameSkip.Frames2to4 = "| fotogramas"
Settings.Emulator.FastForward.FrameSkip.Frames = "| fotogramas"
Settings.Emulator.FastForward.Limiter = "Limitador"
_Settings.Emulator.FastForward.Limiter.tooltip = "Sets the maximum speed when fast forwarding."
Settings.Emulator.FastForward.mute = "Silenciar sonido cuando se esté avanzando fotogramas"
Settings.Emulator.Rewind = "Rebobinado"
Settings.Emulator.Rewind.Frequency = "Frecuencia"
Settings.Emulator.Rewind.Frequency.everyFrames = "Cada | fotogramas"
Settings.Emulator.Rewind.Length = "Longitud"
Settings.Emulator.Rewind.Length.states = "| estados"
Settings.Emulator.Rewind.mute = "Silenciar sonido cuando se esté rebobinando"
Settings.Enhancements = "Mejoras"
Settings.Enhancements.FastMode = "Modo rápido"
Settings.Enhancements.RunAhead = "Adelantar fotogramas"
Settings.Enhancements.RunAhead.Frames = "fotogramas"
Settings.Enhancements.RunAhead.One = "Un"
Settings.Enhancements.RunAhead.Two = "Dos"
Settings.Enhancements.RunAhead.Three = "Tres"
Settings.Enhancements.RunAhead.Four = "Cuatro"
Settings.Enhancements.Overclocking = "Overclocking"
Settings.Enhancements.Ppu.Video = "vídeo"
Settings.Enhancements.Ppu.Deinterlace = "Desentrelazar"
Settings.Enhancements.Ppu.NoSpriteLimit = "Sin limite de sprites"
Settings.Enhancements.hdMode7.FastPpuOnly = "solo con modo rápido (PPU)"
Settings.Enhancements.hdMode7.Scale = "Escala"
Settings.Enhancements.hdMode7.PerspectiveCorrection = "Correción de perspectiva"
Settings.Enhancements.hdMode7.Supersampling = "Supermuestreo"
Settings.Enhancements.hdMode7.HdToSdMosaic = "HD→SD Mosaico"
Settings.Enhancements.Dsp.Audio = "audio"
Settings.Enhancements.Dsp.CubicInterpolation = "Interpolación cúbica"
Settings.Enhancements.Coprocessors = "Coprocesadores"
Settings.Enhancements.Coprocessors.PreferHle = "Preferir el nivel alto de emulación (HLE)"
_Settings.Enhancements.Coprocessors.PreferHle.tooltip = "
When checked, less accurate HLE emulation will always be used when available.
When unchecked, HLE will only be used when low-level-emulation (LLE) firmware is missing.
"
Settings.Enhancements.GameEnhancements = "Mejoras de juego"
Settings.Enhancements.GameEnhancements.Hotfixes = "Arreglos"
_Settings.Enhancements.GameEnhancements.Hotfixes.tooltip = "
Even commercially licensed and officially released software sometimes shipped with bugs.
This option will correct certain issues that occurred even on real hardware.
"
Settings.Compatibility = "Compatibilidad"
Settings.Compatibility.entropy = "Entropía (aleatorización)"
_Settings.Compatibility.entropy.None.tooltip = "
All memory and registers are initialized to constant values at startup.
Use this for compatibility with very old demoscene homebrew games.
"
Settings.Compatibility.entropy.Low = "Baja"
_Settings.Compatibility.entropy.Low.tooltip = "
All memory is randomized with repeating patterns, all registers are randomized at startup.
Use this for the most accurate representation of a real SNES.
"
Settings.Compatibility.entropy.High = "Alta"
_Settings.Compatibility.entropy.High.tooltip = "
All memory and registers are randomized as much as possible.
Use this when developing new SNES software to ensure
maximum compatibility with real hardware.
"
Settings.Compatibility.cpu.Processor = "procesador"
Settings.Compatibility.cpu.FastMath = "Matemática rápida"
_Settings.Compatibility.cpu.FastMath.tooltip = "
CPU multiplication and division take time to complete on a real SNES.
Older emulators did not simulate these delays, and provided results immediately.
Some older ROM hacks do not wait for math operations to complete and need this hack.
"
Settings.Compatibility.ppu.Video = "vídeo"
Settings.Compatibility.ppu.NoVramBlocking = "Sin bloqueo de VRAM"
_Settings.Compatibility.ppu.NoVramBlocking.tooltip = "
This option enables emulating a bug in older releases of ZSNES and Snes9x where VRAM blocking was not emulated.
A few older ROM hacks relied on this behavior, and will render graphics incorrectly if not enabled.
Not only is this extremely inaccurate to real hardware, it also hurts the speed of the fast PPU.
Do not enable this option unless you need to play a game that works incorrectly otherwise.
"
Settings.Compatibility.dsp.Audio = "audio"
Settings.Compatibility.dsp.EchoShadowRam = "Sombra de eco RAM"
Settings.Compatibility.dsp.EchoShadowRam.tooltip = "
This option enables emulating a bug in ZSNES where echo RAM was treated as separate from APU RAM.
Many older ROM hacks for “Super Mario World” relied on this behavior, and will crash without enabling this.
It is, however, extremely inaccurate to real hardware and should not be enabled unless required.
"
Settings.Drivers = "Drivers"
Settings.Drivers.Driver = "Driver"
Settings.Drivers.Change = "Cambiar"
Settings.Drivers.Reload = "Reiniciar"
Settings.Drivers.ExclusiveMode = "Modo exclusivo"
Settings.Drivers.Synchronize = "Sincronizar"
Settings.Drivers.ActiveDriver = "Driver activo"
Settings.Drivers.changeConfirm.title = "¿Cambiar driver?"
Settings.Drivers.changeConfirm = "
Advertencia: Drivers incompatibles pueden causar que el emulador crashee.
Es altamente recomendable que cierres primero el juego antes de aplicar.
¿De verdad quieres proceder a cambiar los drivers de todas formas?
"
Settings.noteGameRestart = "Nota: algunos ajustes no tendrán efecto hasta que reinicies el juego."
Settings.Drivers.Video.failedToInitialize = "Fallo al iniciar [|] driver de vídeo"
Settings.Drivers.Video.FullScreenMonitor = "Monitor de pantalla completa"
_Settings.Drivers.Video.FullScreenMonitor.tooltip = "Sets which monitor video is sent to in full-screen mode."
Settings.Drivers.Video.Format = "Formato"
_Settings.Drivers.Video.ExclusiveMode.tooltip = "
Causes full-screen mode to take over all monitors.
This allows adaptive sync to work better and reduces input latency.
However, multi-monitor users should turn this option off.
Note: Direct3D exclusive mode also does not honor the requested monitor.
"
_Settings.Drivers.Video.Synchronize.tooltip = "
Waits for the video card to be ready before rendering frames.
Eliminates dropped or duplicated frames, but can distort audio.
With this option, its recommended to disable audio sync,
and enable dynamic rate control. Or alternatively, adjust
the audio skew option to reduce buffer under/overflows.
"
Settings.Drivers.Video.GpuSync = "Sincronización de GPU"
_Settings.Drivers.Video.GpuSync.tooltip = "
(OpenGL driver only)
Causes the GPU to wait until frames are fully rendered.
In the best case, this can remove up to one frame of input lag.
However, it incurs a roughly 20% performance penalty.
You should disable this option unless you find it necessary.
"
Settings.Drivers.Audio.failedToInitialize = "Fallo al iniciar [|] driver de audio"
Settings.Drivers.Audio.OutputDevice = "Dispositivo de salida"
Settings.Drivers.Audio.SampleRate = "Frecuencia de muestreo"
Settings.Drivers.Audio.Latency = "Latencia"
Settings.Drivers.Audio.ExclusiveMode.tooltip = "
(WASAPI driver only)
Acquires exclusive control of the sound card device.
This can significantly reduce audio latency.
However, it will block sounds from all other applications.
"
_Settings.Drivers.Audio.Synchronize.tooltip = "
Waits for the audio card to be ready before outputting samples.
Eliminates audio distortion, but can distort video.
With this option, its recommended to disable video sync.
For best results, use this with an adaptive sync monitor.
"
Settings.Drivers.Audio.DynamicRate = "Frecuencia dinámica"
_Settings.Drivers.Audio.DynamicRate.tooltip = "
(OSS, XAudio2, waveOut drivers only)
Dynamically adjusts the audio frequency by tiny amounts.
Use this with video sync enabled, and audio sync disabled.
This can produce perfectly smooth video and clean audio,
but only if your monitor refresh rate is set correctly:
60 Hz for NTSC games, and 50 Hz for PAL games.
"
Settings.Drivers.Input.failedToInitialize = "Fallo al iniciar [|] fallo de input"
_Settings.Drivers.Input.Reload.tooltip = "
A driver reload can be used to detect hotplugged devices.
This is useful for APIs that lack auto-hotplug support,
such as DirectInput and SDL.
"
Settings.Drivers.syncModePresets = "Presets de modos de sincronización"
Settings.Drivers.syncModePresets.requirements = "
Adaptive Sync: Requiere un monitor G-Sync o FreeSync.
Dynamic Rate Control: Requiere que la tasa de refresco de tu monitor y la SNES coincidan.
"
Settings.Drivers.syncModePresets.AdaptiveSync = "Adaptive Sync"
_Settings.Drivers.syncModePresets.AdaptiveSync.failure = "
Sorry, the current driver configuration is not compatible with adaptive sync mode.
Adaptive sync requires audio-synchronization support.
"
_Settings.Drivers.syncModePresets.AdaptiveSync.success = "
Adaptive sync works best in exclusive full-screen mode.
Use the lowest audio latency setting your system can manage.
A G-Sync or FreeSync monitor is required.
Adaptive sync must be enabled in your driver settings panel.
"
_Settings.Drivers.syncModePresets.DynamicRateControl = "Dynamic Rate Control"
_Settings.Drivers.syncModePresets.DynamicRateControl.failure = "
Sorry, the current driver configuration is not compatible with the dynamic-rate-control mode.
Dynamic rate control requires video synchronization and audio-dynamic-rate support.
"
_Settings.Drivers.syncModePresets.DynamicRateControl.success = "
Dynamic rate control requires your monitor to be running at:
60 Hz refresh rate for NTSC games, 50 Hz refresh rate for PAL games.
Use the lowest audio latency setting your system can manage.
"
Settings.BuiltinHotkeys.CheckAll = "Chequear todo"
Settings.BuiltinHotkeys.UncheckAll = "Deschequear todo"
Tools = "Herramientas"
Tools.SaveState = "Salvar estado"
Tools.SaveState.Slot = "Espacio de guardado"
Tools.SaveState.Slot.Empty = "vacio"
Tools.LoadState = "Cargar estado"
Tools.LoadState.SelectedStateSlot = "Seleccionar espacio de guardado"
Tools.LoadState.UndoLastSave = "Deshacer espacio de guardado"
Tools.LoadState.RedoLastUndo = "Rehacer último espacio de guardado"
Tools.LoadState.RemoveAllStates = "Quitar todos los espacios"
Tools.LoadState.RemoveAllStates.confirm.title = "¿Quitar todos los espacios rápidos?"
Tools.LoadState.RemoveAllStates.confirm = "¿Estás seguro de que quieres borrar todos los espacios rapidos de este juego?"
Tools.Speed = "Velocidad"
Tools.Speed.Slowest = "La más lenta"
Tools.Speed.Slow = "Lenta"
Tools.Speed.Normal = "Normal"
Tools.Speed.Fast = "Rapida"
Tools.Speed.Fastest = "La más rapida"
Tools.RunMode = "Modo de ejecución"
Tools.RunMode.Normal = "Normal"
Tools.RunMode.PauseEmulation = "Pausar emulación"
Tools.RunMode.FrameAdvance = "Avanze de fotograma"
Tools.Movie = "Película"
Tools.Movie.Play = "Play"
Tools.Movie.Record = "Grabar"
Tools.Movie.ResetAndRecord = "Reiniciar y grabar"
Tools.Movie.Stop = "Parar"
Tools.TakeScreenshot = "Hacer una captura de pantalla"
Tools.CheatFinder = "Buscador de trucos"
Tools.CheatFinder.Address = "Dirección"
Tools.CheatFinder.Value = "Valor"
Tools.CheatFinder.Scan = "Escanear"
Tools.CheatFinder.All = "Todo"
Tools.CheatEditor = "Editor de trucos"
Tools.CheatEditor.remove.confirm.title = "¿Quitar truco(s)?"
Tools.CheatEditor.remove.confirm = "Estás seguro de que quieres quitar todos los trucos seleccionado(s)?"
Tools.CheatEditor.Codes = "Codigo(s)"
Tools.CheatEditor.Enable = "Activar"
Tools.CheatEditor.SelectAll = "Seleccionar todos"
Tools.CheatEditor.UnselectAll = "Deseleccionar todos"
Tools.CheatEditor.AddCheats = "Añadir trucos"
Tools.CheatEditor.AddCheat = "Añadir truco"
Tools.CheatEditor.EditCheat = "Editar truco"
Tools.CheatEditor.Edit = "Editar"
Tools.CheatEditor.FindCheats = "Buscar trucos"
Tools.CheatEditor.noCheats = "Lo siento, no se encontraron trucos para este juego."
Tools.CheatEditor.EnableCheats = "Activar trucos"
_Tools.CheatEditor.EnableCheats.tooltip = "
Master enable for all cheat codes.
When unchecked, no cheat codes will be active.
Use this to bypass game areas that have problems with cheats.
"
Tools.CheatEditor.EnableCheats.disabled = "Todos los codigos de trucos estan desactivados"
Tools.CheatEditor.EnableCheats.enabled = "Todos los codigos de trucos activos estan encendidos"
Tools.CheatEditor.invalidFormat = "Codigo(s) invalidos, por favor usa solo trucos en el siguiente formato"
Tools.StateManager = "Administrador de estados"
Tools.StateManager.Category = "Categoría"
Tools.StateManager.Category.ManagedStates = "Gestión de estados"
Tools.StateManager.Category.QuickStates = "Estados rápidos"
Tools.StateManager.QuickStates.Redo = "Rehacer"
Tools.StateManager.QuickStates.Undo = "Deshacer"
Tools.StateManager.Preview = "Previsualización"
Tools.StateManager.AddState = "Añadir estado"
Tools.StateManager.RenameState = "Renombrar estado"
Tools.StateManager.remove.confirm.title = "¿Quitar estado(s)?"
Tools.StateManager.remove.confirm = "¿Estas seguro de que quieres borar permanentemente los estados seleccionados?"
Tools.ManifestViewer = "Visor de manifiestos"
Tools.ManifestViewer.Manifest = "Manifiesto"
Game.VerifiedGameOpened = "Juego verificado abierto"
Game.GameOpened = "Juego abierto"
Game.GameClosed = "Juego cerrado"
Game.GameReset = "Juego reiniciado"
Game.AndPatchApplied = " y con parche aplicado"
Game.GameOpeningCancelled = "Apertura del juego cancelada"
Game.unverifiedGameWarning.title = "Imagen de juego sin verificar"
Game.unverifiedGameWarning = "
Advertencia: este juego no está verificado.
Abrirlo *puede* llevar a un riesgo de seguridad.
¿Quieres abrirlo igualmente?
"
Game.unverifiedGameWarning.alwaysQuestion.title = "¿Desabilitar advertencia?"
Game.unverifiedGameWarning.alwaysQuestion = "¿De verdad quieres desactivar la advertencia cuando inicias juegos sin verificar?"
Program.Paused = "Pausado"
Program.Unloaded = "Descargado"
Program.CapturedScreenshot = "Pantallazo capturado"
Program.Open.MissingRequiredData = "Faltan datos obligatorios"
Program.Load.LoadGameBoyRom = "Cargar ROM de Game Boy"
Program.Load.GameBoyRoms = "ROMs de Game Boy"
Program.Load.LoadBsMemoryRom = "Cargar ROM de BS Memory"
Program.Load.BsMemoryRoms = "ROMs de BS Memory"
Program.Load.LoadSufamiTurboRomSlot = "Cargar ROM de Sufami Turbo Espacio"
Program.Load.SufamiTurboRoms = "ROMs de Sufami Turbo"
About.Version = "Versión"
About.Copyright = "Copyright"
About.License = "Licencia"
About.Website = "Página web"
About.SameBoy.description = "Emulador de Super Game Boy"
About.Bsnes.description = "Emulador de Super Nintendo"
About.Bsnes.copyright = "byuu et al"
About.Bsnes.license = "GPLv3 o posterior"
Browser.OpenSnesRom = "Abrir ROM de SNES"
Browser.SnesRoms = "ROMs de SNES"
Browser.AllFiles = "Todos los archivos"
Browser.Select = "Seleccionar"
Browser.SelectFolder = "Seleccionar carpeta"
Browser.ChooseFolder = "Elegir una carpeta"
Browser.ShowHidden = "Mostrar ocultos"
Browser.OpenFile = "Abrir archivo"
Browser.OpenFiles = "Abrir archivos"
Browser.OpenFolder = "Abrir carpeta"
Browser.OpenObject = "Abrir objeto"
Browser.Rename.EnterNewFolderName = "Pon el nombre de la nueva carpeta"
Browser.Rename.EnterNewFileName = "Pon el nombre de el nuevo archivo"
Browser.Rename.FailedToRenameFolder = "Fallo al renombrar carpeta."
Browser.Rename.FailedToRenameFile = "Fallo al renombrar archivo."
Browser.Create = "Crear"
Browser.Create.EnterName = "Pon un nombre"
Browser.CreateFolder = "Crear una carpeta"
Browser.CreateFolder.EnterNewFolderName = "Pon un nuevo nombre de carpeta"
Browser.Delete.DeleteSelected = "Borrar seleccionados"
Browser.Delete.FailedToDelete = "Fallo al intentar borrar |. ¿Continuar intentando borrar los items restantes?"
Browser.Delete.confirm = "Estás seguro de que quieres borrar el |"
Browser.Delete.confirm.item = "items seleccionados"
Browser.Delete.confirm.items = "items seleccionados"
Browser.SaveFile = "Guardar archivo"
Browser.SaveFile.fileExists.title = "¿Sobreescribir archivo?"
Browser.SaveFile.fileExists = "El archivo ya existe. ¿Deseas sobreescribirlo?"
_StatusIcon.verifiedRom.tooltip = "
This is a known clean game image.
PCB emulation is 100% accurate.
"
_StatusIcon.unverifiedRom.tooltip = "
This is not a verified game image.
PCB emulation is relying on heuristics.
"
ResetDrivers.message.title = "Drivers reiniciados"
_ResetDrivers.message = "
Hardware drivers have been reset according to the `--resetdrivers` command-line option.
Please reconfigure drivers in the “Settings” → “Drivers” window that will now open.
"
Rewind.HistoryExhausted = "Historial de rebobinado agotado"
States.incompatibleFormat = "[|] esta en un formato incompatible"
States.Loaded = "Cargado"
States.NotFound = "[|] no encontrado"
States.FailedToSave = "Fallo al guardar [|]"
States.UnableToWriteToDisk = "Incapaz de escribir [|] al disco"
States.Saved = "Guardado [|]"
Patch.ipsWarning = "
(Estás viendo este mensaje porque IPS es un formato de archivo de parche terrible y nadie puede ponerse de acuerdo sobre si las ROMs de SNES deben encabezarse o no.
Considere pedirle al autor del parche que utilice parches BPS en su lugar.)
¿Se espera que este parche IPS se aplique a una ROM con encabezado?
Si no está seguro, pruebe con “No” y, si no funciona, vuelva a intentarlo con “Sí”.
"
Patch.ensureHeaderless = "Por favor, asegurese que este usando el juego (sin encabezado) correcto para este parche."
Movies.PlayMovie = "Iniciar película"
Movies.Movies = "Películas"
Movies.playbackStarted = "Reproducción de película iniciada"
Movies.playbackStopped = "Reproducción de película parada"
Movies.formatNotSupported = "El formato de la película no es compatible"
Movies.recordingStarted = "Grabado de película empezada"
Movies.SaveMovie = "Salvar película"
Movies.MovieRecorded = "Película grabada"
Movies.MovieNotRecorded = "Película no grabada"
Movies.cantRecord = "La película no pudo ser grabada"
Devices.Gamepad = "Mando"
Devices.Mouse = "Ratón"
Hotkeys.ToggleMouseCapture = "Habilitar captura de ratón"
Hotkeys.ToggleCheatCodes = "Habilitar codigos de trucos"
Hotkeys.Rewind = "Rebobinar"
Hotkeys.LoadUndoState = "Cargar estado desecho"
Hotkeys.LoadRedoState = "Cargar estado rehecho"
_Hotkeys.DecrementStateSlot = "Decrement State Slot"
_Hotkeys.IncrementStateSlot = "Increment State Slot"
Hotkeys.FastForward = "Avance rápido"
Hotkeys.FrameAdvance = "Avanze de frame"
Hotkeys.DecreaseHDMode7 = "Disminuir modo 7 HD"
Hotkeys.IncreaseHDMode7 = "Incrementar modo 7 HD"
Hotkeys.ToggleSupersampling = "Activar Supermuestreo"
Hotkeys.ResetEmulation = "Reiniciar emulación"
Hotkeys.QuitEmulator = "Salir del emulador"

View file

@ -0,0 +1,663 @@
Translation.author = "KarLKoX-FR"
Translation.version = "1.3.3"
Common.Yes = "Oui"
Common.No = "Non"
Common.Cancel = "Annuler"
Common.Always = "Toujours"
Common.AreYouSure = "Êtes vous sûr ?"
Common.Open = "Ouvrir"
Common.Load = "Charger"
Common.Save = "Sauver"
Common.Add = "Ajouter"
Common.Remove = "Enlever"
Common.Delete = "Supprimer"
Common.Rename = "Renommer"
Common.Reset = "Réinitialiser"
Common.Clear = "Effacer"
Common.None = "Aucun"
Common.Disabled = "Désactivé"
Common.Default = "Défaut"
Common.Name = "Nom"
Common.Date = "Date"
Common.Success = "Succès"
Common.Failure = "Échec"
Common.Error = "Erreur"
Common.Warning = "Avertissement"
Common.Auto = "Auto"
Common.Video = "Vidéo"
Common.Audio = "Audio"
Common.Fps = "ips"
Common.Hz = "Hz"
Common.number = "#"
Menu.File = "Fichier"
Menu.File.OpenGame = "Ouvrir jeu"
Menu.File.OpenRecentGame = "Ouvrir jeu récent"
Menu.File.OpenRecentGame.ClearList = "Effacer liste"
Menu.File.OpenRecentGame.ClearList.confirm.title = "Effacer la liste des jeux récents ?"
Menu.File.OpenRecentGame.ClearList.confirm = "Êtes vous sûr de vouloir effacer la liste des jeux récents ?"
Menu.File.OpenRecentGame.NoRecentGames = "Aucun jeux récents"
Menu.File.CloseGame = "Fermer jeu"
Menu.File.Exit = "Quitter"
Menu.System = "Système"
Menu.System.ControllerPort = "Port du contrôleur"
Menu.System.ExpansionPort = "Port dexpansion"
Menu.Settings.Size = "Taille"
Menu.Settings.Size.ShrinkWindowToSize = "Adapter la fenêtre aux dimensions de limage"
Menu.Settings.Size.CenterWindow = "Centrer la fenêtre"
Menu.Settings.Size.FullScreenMode = "Mode plein écran"
Menu.Settings.Size.PseudoFullScreenMode = "Mode pseudo-plein écran"
Menu.Settings.Output = "Sortie"
Menu.Settings.Output.Center = "Centrer"
Menu.Settings.Output.PixelPerfect = "Pixel-parfait"
Menu.Settings.Output.Scale = "Échelle"
Menu.Settings.Output.Stretch = "Étirer"
Menu.Settings.Output.AspectRatioCorrection = "Corriger le ratio de laspect"
Menu.Settings.Output.parInsteadOfAr = "8:7 PAR au lieu de lAR 4:3"
Menu.Settings.Output.ShowOverscanArea = "Afficher la zone de surbalayage (overscan)"
Menu.Settings.Output.scalingInfo = "Info déchelle dans la barre détat"
Menu.Settings.Output.HiresBlurEmulation = "Émulation du flou haute résolution"
Menu.Settings.Filter = "Filtrer"
Menu.Settings.Shader = "Shader"
Menu.Settings.Shader.Blur = "Flou"
Menu.Settings.MuteAudio = "Désactiver le son"
Menu.Settings.ShowStatusBar = "Afficher la barre détat"
Menu.Settings.OpenSettingsFolder = "Ouvrir le dossier des paramètres"
Menu.Help = "Aide"
Menu.Help.About = "À propos de |"
Settings = "Paramètres"
Settings.Common.Assign = "Affecter"
Settings.Common.AssignLowercase = "affecter"
Settings.Common.Mapping = "Mapping"
Settings.Common.MappingAssigned = "Mapping affecté."
Settings.Common.PressKeyOrButtonForMapping = "Appuyez sur une touche ou un bouton pour mapper"
Settings.Common.FrameLowercase = "image"
Settings.Video.ColorAdjustment = "Ajuster couleur"
Settings.Video.Luminance = "Luminosité"
Settings.Video.Saturation = "Saturation"
Settings.Video.Gamma = "Gamma"
Settings.Video.DimVideoWhenIdle = "Diminuez la luminosité de lécran lorsque lémulateur nest pas utilisé"
Settings.Video.DimVideoWhenIdle.tooltip = "Assombrir lécran pour indiquer que lémulateur nest pas utilisé."
Settings.Video.DrawSnowEffectWhenIdle = "Afficher leffet de neige lorsque lémulateur nest pas utilisé"
Settings.Audio.Effects = "Effets"
Settings.Audio.Skew = "Décalage du taux"
Settings.Audio.Skew.tooltip = "
Règle la fréquence audio par la valeur de décalage du taux (en Hz).
Il sagit essentiellement dun contrôle statique du taux déchantillonage.
Tout dabord, il faut activation la synchronisation vidéo et audio.
Ensuite, augmenter ou diminuer cette valeur afin de réduire les erreurs.
Une direction pourra aider la vidéo mais nuira à laudio.
Lautre sens fera linverse.
Lidée est de trouver le meilleur compromis.
Vous devriez laisser cette valeur à 0 lorsque vous utilisez le contrôle
du taux dynamique.
"
Settings.Audio.Volume = "Volume"
Settings.Audio.Volume.tooltip = "
Règle le volume de la sortie audio.
Si possible, il est déconseillé dutiliser une valeur au delà de 100% !
Si vous le faites, une distorsion par coupure audio peut se produire.
"
Settings.Audio.Balance = "Balance"
Settings.Audio.Balance.tooltip = "
Balance audio à gauche (valeurs les plus faibles)
ou à droite (valeurs les plus élevées).
50% (centré) est la valeur recommandée.
"
Settings.Audio.MuteWhenUnfocused = "Désactiver le son si perte de focus"
Settings.Input = "Entrée"
Settings.Input.WhenFocusIsLost = "Lorsque le focus est perdu"
Settings.Input.WhenFocusIsLost.PauseEmulation = "Suspendre lémulation"
Settings.Input.WhenFocusIsLost.BlockInput = "Bloquer lentrée"
Settings.Input.WhenFocusIsLost.AllowInput = "Autoriser lentrée"
Settings.Input.Port = "Port"
Settings.Input.Device = "Périphérique"
Settings.Input.TurboRate = "Vitesse du turbo"
Settings.Input.TurboRate.tooltip = "Le nombre dimages à attendre entre lactivation des boutons turbo."
Settings.Input.MouseLeft = "Clic gauche"
Settings.Input.MouseMiddle = "Clic milieu"
Settings.Input.MouseRight = "Clic droit"
Settings.Input.MouseXAxis = "Axe-X de la souris"
Settings.Input.MouseYAxis = "Axe-Y de la souris"
Settings.Hotkeys = "Raccourcis"
Settings.Hotkeys.CombinationalLogic = "Logique combinatoire"
Settings.Hotkeys.CombinationalLogic.tooltip = "
Détermine si tout ou partie des mappings doit être appuyé
pour activer les raccourcis.
Utilisez la logique « ET » si vous souhaitez une combinaison
de touche comme Ctrl+F pour déclencher le raccourcis.
Utilisez la logique « OU » si vous souhaitez que le clavier
et le joypad déclenchent tous les deux le même raccourcis.
"
Settings.Hotkeys.CombinationalLogic.And = "ET"
Settings.Hotkeys.CombinationalLogic.And.tooltip = "Chaque mapping doit être appuyé pour activer un raccourcis en particulier."
Settings.Hotkeys.CombinationalLogic.Or = "OU"
Settings.Hotkeys.CombinationalLogic.Or.tooltip = "Nimporte quel mapping peut être appuyé pour activer un raccourcis en particulier."
Settings.Hotkeys.Rewind.enableFirst = "Veuillez dabord activer la fonctionnalité de rembobinage dans le menu « Paramètres » → « Émulateur »"
Settings.BuiltinHotkeys = "Raccourcis (intégrés)"
Settings.Paths = "Chemins"
Settings.Paths.Games = "Jeux"
Settings.Paths.Patches = "Patches"
Settings.Paths.Saves = "Sauvegardes"
Settings.Paths.Cheats = "Triches"
Settings.Paths.States = "États"
Settings.Paths.Screenshots = "Captures décran"
Settings.Paths.LastRecentlyUsed = "dernièrement utilisé"
Settings.Paths.SameAsLoadedGame = "même que le jeu chargé"
Settings.Emulator = "Émulateur"
Settings.Emulator.General = "Général"
Settings.Emulator.General.warnOnUnverifiedGames = "Avertir lors de louverture de jeux qui nont pas été vérifiés"
Settings.Emulator.General.autoSaveMemory = "Sauvegarder la mémoire périodiquement"
Settings.Emulator.General.autoSaveStateOnUnload = "Sauvegarder létat dannulation lors du déchargement des jeux"
Settings.Emulator.General.AutoResumeOnLoad = "Reprendre lors du chargement"
Settings.Emulator.General.UseNativeFileDialogs = "Utiliser les boites de dialogues natives"
Settings.Emulator.FastForward = "Avance rapide (Fast Forward)"
Settings.Emulator.FastForward.FrameSkip = "Nombre dimages à éviter"
Settings.Emulator.FastForward.FrameSkip.tooltip = "
Définit le nombre dimages à éviter lors de lavance rapide.
Éviter le rendu dimages permet une vitesse davance rapide maximale plus élevée.
"
Settings.Emulator.FastForward.FrameSkip.Frames2to4 = "| images"
Settings.Emulator.FastForward.FrameSkip.Frames = "| images"
Settings.Emulator.FastForward.Limiter = "Limiteur"
Settings.Emulator.FastForward.Limiter.tooltip = "Définit la vitesse maximale lors de lavance rapide."
Settings.Emulator.FastForward.mute = "Désactiver le son lors de lavance rapide"
Settings.Emulator.Rewind = "Rembobinage"
Settings.Emulator.Rewind.Frequency = "Fréquence"
Settings.Emulator.Rewind.Frequency.everyFrames = "Chaque | images"
Settings.Emulator.Rewind.Length = "Durée"
Settings.Emulator.Rewind.Length.states = "| états"
Settings.Emulator.Rewind.mute = "Désactiver le son lors du rembobinage"
Settings.Enhancements = "Améliorations"
Settings.Enhancements.FastMode = "Mode rapide"
Settings.Enhancements.RunAhead = "Exécution à venir (Run-Ahead)"
Settings.Enhancements.RunAhead.Frames = "images"
Settings.Enhancements.RunAhead.One = "Une"
Settings.Enhancements.RunAhead.Two = "Deux"
Settings.Enhancements.RunAhead.Three = "Trois"
Settings.Enhancements.RunAhead.Four = "Quatre"
Settings.Enhancements.Overclocking = "Overclocking"
Settings.Enhancements.Ppu.Video = "vidéo"
Settings.Enhancements.Ppu.Deinterlace = "Désentrelacer"
Settings.Enhancements.Ppu.NoSpriteLimit = "Pas de limite de sprite"
Settings.Enhancements.hdMode7.FastPpuOnly = "PPU rapide uniquement"
Settings.Enhancements.hdMode7.Scale = "Échelle"
Settings.Enhancements.hdMode7.PerspectiveCorrection = "Correction de la perspective"
Settings.Enhancements.hdMode7.Supersampling = "Suréchantillonnage"
Settings.Enhancements.hdMode7.HdToSdMosaic = "HD→SD mosaïque"
Settings.Enhancements.Dsp.Audio = "audio"
Settings.Enhancements.Dsp.CubicInterpolation = "Interpolation cubique"
Settings.Enhancements.Coprocessors = "Coprocesseurs"
Settings.Enhancements.Coprocessors.PreferHle = "Préférer lémulation de haut niveau (HLE)"
Settings.Enhancements.Coprocessors.PreferHle.tooltip = "
Lorsque coché, une émulation HLE moins précise sera
toujours utilisée lorsque cela est possible.
Lorsque décoché, le HLE sera utilisé uniquement si le micro-
programme de lémulation bas-niveau (LLE) est manquant.
"
Settings.Enhancements.GameEnhancements = "Améliorations de jeux"
Settings.Enhancements.GameEnhancements.Hotfixes = "Correctifs"
Settings.Enhancements.GameEnhancements.Hotfixes.tooltip = "
Même les logiciels sous licence commerciale et les logiciels
officiels sont parfois livrés avec des bogues.
Cette option permettra de corriger certains problèmes
qui se sont produits même sur du matériel réel.
"
Settings.Compatibility = "Compatibilité"
Settings.Compatibility.entropy = "Entropie (randomisation)"
Settings.Compatibility.entropy.None.tooltip = "
Toutes les mémoires et tous les registres sont
initialisés à des valeurs constantes au démarrage.
A utiliser pour la compatibilité avec les très anciens
jeux fait maison de la démoscene.
"
Settings.Compatibility.entropy.Low = "Bas"
Settings.Compatibility.entropy.Low.tooltip = "
Toute la mémoire est randomisée avec des motifs répétitifs,
tous les registres sont randomisés au démarrage.
A utiliser pour obtenir la représentation la plus précise
possible dune vraie SNES.
"
Settings.Compatibility.entropy.High = "Haut"
Settings.Compatibility.entropy.High.tooltip = "
Toutes les mémoires et tous les registres sont randomisés autant que possible.
Utilisez cette méthode lors du développement de nouveaux logiciels SNES
pour garantir une compatibilité maximale avec le matériel réel.
"
Settings.Compatibility.cpu.Processor = "processeur"
Settings.Compatibility.cpu.FastMath = "Mathématique rapide"
Settings.Compatibility.cpu.FastMath.tooltip = "
La multiplication et la division du CPU prennent
du temps à être réalisés sur une vraie SNES.
Les anciens émulateurs ne simulaient pas ces délais,
et fournissaient des résultats immédiatement.
Certaines anciennes ROM bidouillées nattendent pas
que les opérations mathématiques soient terminées
et ont besoin de ce bidouillage.
"
Settings.Compatibility.ppu.Video = "vidéo"
Settings.Compatibility.ppu.NoVramBlocking = "Pas de blocage de la mémoire vidéo (VRAM)"
Settings.Compatibility.ppu.NoVramBlocking.tooltip = "
Cette option permet démuler un bogue dans les anciennes versions
de ZSNES et Snes9x où le verrouillage de la VRAM nétait pas émulé.
Quelques anciennes ROM bidouillées reposaient sur ce comportement,
et afficheront les graphiques de manière incorrecte sils ne sont pas activés.
Non seulement ce comportement est extrêmement imprécis par rapport
au matériel réel, mais il nuit également à la vitesse du PPU rapide.
Nactivez pas cette option, sauf si vous avez besoin de jouer
à un jeu qui ne fonctionne pas correctement autrement.
"
Settings.Compatibility.dsp.Audio = "audio"
Settings.Compatibility.dsp.EchoShadowRam = "Echo RAM ombragée"
Settings.Compatibility.dsp.EchoShadowRam.tooltip = "
Cette option permet démuler un bogue dans ZSNES où lécho
de la RAM était traitée comme distincte de la RAM de lAPU.
De nombreuses anciennes ROM bidouillées pour « Super Mario World »
reposaient sur ce comportement, et planteront sans lactiver.
Elle est cependant extrêmement imprécise par rapport au matériel réel
et ne devrait pas être activée à moins que cela ne soit nécessaire.
"
Settings.Drivers = "Pilotes"
Settings.Drivers.Driver = "Pilote"
Settings.Drivers.Change = "Changer"
Settings.Drivers.Reload = "Recharger"
Settings.Drivers.ExclusiveMode = "Mode exclusif"
Settings.Drivers.Synchronize = "Synchroniser"
Settings.Drivers.ActiveDriver = "Pilote actif"
Settings.Drivers.changeConfirm.title = "Changer de pilote ?"
Settings.Drivers.changeConfirm = "
Attention : les pilotes incompatibles peuvent provoquer un plantage de lapplication.
Il est fortement recommandé de décharger dabord votre jeu pour être sûr.
Souhaitez-vous quand même procéder au changement de pilote malgré tout ?
"
Settings.noteGameRestart = "Note : certains paramètres ne prendront effet quau rechargement du jeu."
Settings.Drivers.Video.failedToInitialize = "Échec de linitialisation [|] du pilote vidéo"
Settings.Drivers.Video.FullScreenMonitor = "Moniteur plein écran"
Settings.Drivers.Video.FullScreenMonitor.tooltip = "Détermine vers quel moniteur le signal vidéo est envoyé en mode plein écran."
Settings.Drivers.Video.Format = "Format"
Settings.Drivers.Video.ExclusiveMode.tooltip = "
Provoque le mode plein écran à prendre le dessus sur tous les moniteurs.
Cela permet à la synchronisation adaptative de mieux fonctionner et de réduire la latence dentrée.
Toutefois, les utilisateurs de moniteurs multiples doivent désactiver cette option.
Note : Le mode exclusif Direct3D nhonore pas non plus le moniteur demandé.
"
Settings.Drivers.Video.Synchronize.tooltip = "
Attend que la carte vidéo soit prête avant dafficher les images.
Élimine les images perdues ou dupliquées, mais peut déformer le son.
Avec cette option, il est recommandé de désactiver la synchronisation
audio, et dactiver le contrôle dynamique du taux. Ou alors, ajuster
loption de compensation audio pour réduire les sous-débits
et les débordements de la mémoire tampon.
"
Settings.Drivers.Video.GpuSync = "Synchronisation du GPU"
Settings.Drivers.Video.GpuSync.tooltip = "
(Pilote OpenGL uniquement)
Fait attendre le GPU jusquà ce que les images soient entièrement affichées.
Dans le meilleur des cas, cela peut supprimer jusquà une image de retard dentrée.
Cependant, cela entraîne une perte de performance denviron 20%.
Vous devriez désactiver cette option, sauf si vous lestimez nécessaire.
"
Settings.Drivers.Audio.failedToInitialize = "Échec de linitialisation [|] du pilote audio"
Settings.Drivers.Audio.OutputDevice = "Périphérique de sortie"
Settings.Drivers.Audio.SampleRate = "Taux déchantillonage"
Settings.Drivers.Audio.Latency = "Latence"
Settings.Drivers.Audio.ExclusiveMode.tooltip = "
(Pilote WASAPI uniquement)
Acquiert le contrôle exclusif du périphérique audio.
Cela peut réduire considérablement la latence audio.
Cependant, cela bloquera les sons provenant de toutes les autres applications.
"
Settings.Drivers.Audio.Synchronize.tooltip = "
Attend que la carte audio soit prête avant de produire des échantillons.
Élimine la distorsion audio, mais peut déformer la vidéo.
Avec cette option, il est recommandé de désactiver la synchronisation vidéo.
Pour de meilleurs résultats, utilisez cette option avec un moniteur à synchronisation adaptative.
"
Settings.Drivers.Audio.DynamicRate = "Taux dynamique"
Settings.Drivers.Audio.DynamicRate.tooltip = "
(Pilotes OSS, XAudio2, waveOut uniquement)
Ajuste dynamiquement la fréquence audio par de minuscules quantités.
Utilisez-le avec la synchronisation vidéo activée, et la synchronisation audio désactivée.
Cela permet de produire une vidéo parfaitement fluide et un son propre, mais
seulement si le taux de rafraîchissement de votre moniteur est correctement réglé :
60 Hz pour les jeux NTSC, et 50 Hz pour les jeux PAL.
"
Settings.Drivers.Input.failedToInitialize = "Échec de linitialisation [|] du pilote dentrée"
Settings.Drivers.Input.Reload.tooltip = "
La recharge dun pilote peut être utilisée pour détecter
les appareils branchés à chaud.
Cela est utile pour les API qui ne prennent pas en charge
lauto-hotplug, tels que DirectInput et SDL.
"
Settings.Drivers.syncModePresets = "Préréglages du mode de synchronisation"
Settings.Drivers.syncModePresets.requirements = "
Synchronisation adaptative : nécessite un moniteur G-Sync ou FreeSync.
Contrôle dynamique du taux : nécessite que le moniteur et les taux de rafraîchissement SNES correspondent.
"
Settings.Drivers.syncModePresets.AdaptiveSync = "Synchronisation adaptative"
Settings.Drivers.syncModePresets.AdaptiveSync.failure = "
Désolé, la configuration actuelle du pilote nest pas compatible avec le mode de synchronisation adaptative.
La synchronisation adaptative nécessite la prise en charge de la synchronisation audio.
"
Settings.Drivers.syncModePresets.AdaptiveSync.success = "
La synchronisation adaptative fonctionne mieux en mode plein écran exclusif.
Utilisez le réglage de latence audio le plus faible que vôtre système peut gérer.
Un moniteur G-Sync ou FreeSync est nécessaire.
La synchronisation adaptative doit être activée dans le panneau de configuration de vôtre pilote.
"
Settings.Drivers.syncModePresets.DynamicRateControl = "Contrôle dynamique du taux"
Settings.Drivers.syncModePresets.DynamicRateControl.failure = "
Désolé, la configuration actuelle du pilote nest pas compatible avec le mode de contrôle dynamique du taux.
Le contrôle dynamique du taux nécessite la synchronisation vidéo et la prise en charge du taux audio-dynamique.
"
Settings.Drivers.syncModePresets.DynamicRateControl.success = "
Le contrôle dynamique du taux exige que votre moniteur fonctionne à ces taux de rafraîchissement :
60 Hz pour les jeux NTSC, 50 Hz pour les jeux PAL.
Utilisez le réglage de latence audio le plus bas que vôtre système peut gérer.
"
Settings.BuiltinHotkeys.CheckAll = "Cocher tout"
Settings.BuiltinHotkeys.UncheckAll = "Décocher tout"
Tools = "Outils"
Tools.SaveState = "Sauvegarder état"
Tools.SaveState.Slot = "Emplacement"
Tools.SaveState.Slot.Empty = "vide"
Tools.LoadState = "Charger état"
Tools.LoadState.SelectedStateSlot = "Emplacement détat sélectionné"
Tools.LoadState.UndoLastSave = "Annuler la précédente sauvegarde"
Tools.LoadState.RedoLastUndo = "Refaire la dernière annulation"
Tools.LoadState.RemoveAllStates = "Enlever tous les états"
Tools.LoadState.RemoveAllStates.confirm.title = "Enlever les états rapides ?"
Tools.LoadState.RemoveAllStates.confirm = "Êtes vous sûr de vouloir enlever de manière permanente tous les états rapides pour ce jeu ?"
Tools.Speed = "Vitesse"
Tools.Speed.Slowest = "Le plus lent"
Tools.Speed.Slow = "Lent"
Tools.Speed.Normal = "Normal"
Tools.Speed.Fast = "Rapide"
Tools.Speed.Fastest = "Le plus rapide"
Tools.RunMode = "Mode dexécution"
Tools.RunMode.Normal = "Normal"
Tools.RunMode.PauseEmulation = "Pause émulation"
Tools.RunMode.FrameAdvance = "Image par image (Frame Advance)"
Tools.Movie = "Film"
Tools.Movie.Play = "Jouer"
Tools.Movie.Record = "Enregistrer"
Tools.Movie.ResetAndRecord = "Réinitialiser et enregistrer"
Tools.Movie.Stop = "Arrêter"
Tools.TakeScreenshot = "Prendre une capture décran"
Tools.CheatFinder = "Recherche de triche"
Tools.CheatFinder.Address = "Adresse"
Tools.CheatFinder.Value = "Valeur"
Tools.CheatFinder.Scan = "Analyser"
Tools.CheatFinder.All = "Tout"
Tools.CheatEditor = "Éditeur de triches"
Tools.CheatEditor.remove.confirm.title = "Enlever triche(s) ?"
Tools.CheatEditor.remove.confirm = "Êtes vous sûr de vouloir enlever de manière permanente la ou les triche(s) sélectionnée(s) ?"
Tools.CheatEditor.Codes = "Code(s)"
Tools.CheatEditor.Enable = "Activer"
Tools.CheatEditor.SelectAll = "Sélectionner tout"
Tools.CheatEditor.UnselectAll = "Désélectionner tout"
Tools.CheatEditor.AddCheats = "Ajouter triches"
Tools.CheatEditor.AddCheat = "Ajouter triche"
Tools.CheatEditor.EditCheat = "Éditer triche"
Tools.CheatEditor.Edit = "Éditer"
Tools.CheatEditor.FindCheats = "Rechercher triches"
Tools.CheatEditor.noCheats = "Désolé, aucunes triches na été trouvé pour ce jeu."
Tools.CheatEditor.EnableCheats = "Activer triches"
Tools.CheatEditor.EnableCheats.tooltip = "
Activation des codes de triche.
Lorsque décoché, aucun code de triche ne sera actif.
À utiliser pour contourner les zones de jeux qui ont
des problèmes avec les triches.
"
Tools.CheatEditor.EnableCheats.disabled = "Tous les codes de triche sont désactivés"
Tools.CheatEditor.EnableCheats.enabled = "Les codes de triche actifs sont activés"
Tools.CheatEditor.invalidFormat = "Code(s) invalide(s), veuillez nutiliser des codes que dans le format suivant"
Tools.StateManager = "Gestionnaire détat"
Tools.StateManager.Category = "Catégorie"
Tools.StateManager.Category.ManagedStates = "États gérés"
Tools.StateManager.Category.QuickStates = "États rapides"
Tools.StateManager.QuickStates.Redo = "Refaire"
Tools.StateManager.QuickStates.Undo = "Annuler"
Tools.StateManager.Preview = "Prévisualiser"
Tools.StateManager.AddState = "Ajouter état"
Tools.StateManager.RenameState = "Renommer état"
Tools.StateManager.remove.confirm.title = "Enlever état(s) ?"
Tools.StateManager.remove.confirm = "Êtes vous sûr de vouloir enlever de manière permanente la ou les état(s) sélectionné(s) ?"
Tools.ManifestViewer = "Visionneuse de manifeste"
Tools.ManifestViewer.Manifest = "Manifeste"
Game.VerifiedGameOpened = "Jeu vérifié ouvert"
Game.GameOpened = "Jeu ouvert"
Game.GameClosed = "Jeu fermé"
Game.GameReset = "Jeu réinitialisé"
Game.AndPatchApplied = " et patch appliqué"
Game.GameOpeningCancelled = "Ouverture du jeu annulée"
Game.unverifiedGameWarning.title = "Image de jeu non vérifiée"
Game.unverifiedGameWarning = "
Attention : cette image de jeu nest pas vérifiée.
Son exécution *peut* constituer un risque pour la sécurité.
Souhaitez-vous quand même lancer le jeu ?
"
Game.unverifiedGameWarning.alwaysQuestion.title = "Désactiver lavertissement ?"
Game.unverifiedGameWarning.alwaysQuestion = "Souhaitez-vous désactiver lavertissement lors de lexécution de jeux non vérifiés ?"
Program.Paused = "En pause"
Program.Unloaded = "Déchargé"
Program.CapturedScreenshot = "Capture décran effectuée"
Program.Open.MissingRequiredData = "Données requises manquantes"
Program.Load.LoadGameBoyRom = "Charger ROM Game Boy"
Program.Load.GameBoyRoms = "ROMs Game Boy"
Program.Load.LoadBsMemoryRom = "Charger ROM BS Memory"
Program.Load.BsMemoryRoms = "ROMs BS Memory"
Program.Load.LoadSufamiTurboRomSlot = "Charger ROM Sufami Turbo Slot"
Program.Load.SufamiTurboRoms = "ROMs Sufami Turbo"
About.Version = "Version"
About.Copyright = "Copyright"
About.License = "Licence"
About.Website = "Site web"
About.SameBoy.description = "Émulateur de Super Game Boy"
About.Bsnes.description = "Émulateur de Super Nintendo"
About.Bsnes.copyright = "Équipe bsnes"
About.Bsnes.license = "GPLv3 ou ultérieur"
Browser.OpenSnesRom = "Ouvrir ROM SNES"
Browser.SnesRoms = "ROMs SNES"
Browser.AllFiles = "Tous les fichiers"
Browser.Select = "Sélectionner"
Browser.SelectFolder = "Sélectionner dossier"
Browser.ChooseFolder = "Choisir un dossier"
Browser.ShowHidden = "Montrer caché"
Browser.OpenFile = "Ouvrir fichier"
Browser.OpenFiles = "Ouvrir fichiers"
Browser.OpenFolder = "Ouvrir dossier"
Browser.OpenObject = "Ouvrir objet"
Browser.Rename.EnterNewFolderName = "Saisir le nom du nouveau dossier"
Browser.Rename.EnterNewFileName = "Saisir le nom du nouveau fichier"
Browser.Rename.FailedToRenameFolder = "Échec lors du renommage du dossier."
Browser.Rename.FailedToRenameFile = "Échec lors du renommage du fichier."
Browser.Create = "Créer"
Browser.Create.EnterName = "Saisir un nom"
Browser.CreateFolder = "Créer dossier"
Browser.CreateFolder.EnterNewFolderName = "Saisir un nom pour le nouveau-dossier"
Browser.Delete.DeleteSelected = "Supprimer la sélection"
Browser.Delete.FailedToDelete = "Échec lors de la suppression |. Continuer à essayer de supprimer les éléments restants ?"
Browser.Delete.confirm = "Êtes-vous sûr de vouloir supprimer de manière permanente |"
Browser.Delete.confirm.item = "lélément selectionné"
Browser.Delete.confirm.items = "les éléments sélectionnés"
Browser.SaveFile = "Enregistrer fichier"
Browser.SaveFile.fileExists.title = "Écraser le fichier ?"
Browser.SaveFile.fileExists = "Le fichier existe déjà. Voulez-vous lécraser ?"
StatusIcon.verifiedRom.tooltip = "
Il sagit dune image de jeu propre connue.
Lémulation de la carte du circuit imprimé (PCB) est précise à 100%.
"
StatusIcon.unverifiedRom.tooltip = "
Il ne sagit pas dune image de jeu vérifiée.
Lémulation du PCB repose sur lheuristique.
"
ResetDrivers.message.title = "Réinitialiser les pilotes"
ResetDrivers.message = "
Les pilotes de matériel ont été réinitialisés selon loption de ligne de commande `--resetdrivers`.
Veuillez reconfigurer les pilotes dans la fenêtre « Paramètres » → « Pilotes » qui va maintenant souvrir.
"
Rewind.HistoryExhausted = "Historique du rembobinage saturé"
States.incompatibleFormat = "[|] est dans un format incompatible"
States.Loaded = "Chargé"
States.NotFound = "[|] introuvable"
States.FailedToSave = "Échec de la sauvegarde [|]"
States.UnableToWriteToDisk = "Impossible décrire [|] sur le disque"
States.Saved = "Sauvegardé [|]"
Patch.ipsWarning = "
(Vous voyez cette invite parce que lIPS est un format de fichier patch terrible, et personne ne peut se mettre daccord sur le fait que les ROMs SNES doivent contenir une en-tête ou non.
Veuillez envisager de demander à lauteur du patch dutiliser plutôt des patchs BPS).
Est-ce que ce patch IPS sattend à être appliqué à une ROM avec une en-tête ?
Si vous nêtes pas sûr, essayez « Non », et si cela ne fonctionne pas, essayez à nouveau avec « Oui ».
"
Patch.ensureHeaderless = "Veuillez vous assurer que vous utilisez la bonne ROM (sans en-tête) pour ce patch."
Movies.PlayMovie = "Jouer film"
Movies.Movies = "Films"
Movies.playbackStarted = "Début de la lecture du film"
Movies.playbackStopped = "Arrêt de la lecture du film"
Movies.formatNotSupported = "Le format du film nest pas pris en charge"
Movies.recordingStarted = "Début de lenregistrement du film"
Movies.SaveMovie = "Sauvegarder le film"
Movies.MovieRecorded = "Film enregistré"
Movies.MovieNotRecorded = "Film non enregistré"
Movies.cantRecord = "Le film ne peut être enregistré"
Devices.Gamepad = "Gamepad"
Devices.Mouse = "Souris"
Hotkeys.ToggleMouseCapture = "Basculer la capture de souris"
Hotkeys.ToggleCheatCodes = "Basculer les codes de triche"
Hotkeys.Rewind = "Rembobinage"
Hotkeys.LoadUndoState = "Charger annulation détat"
Hotkeys.LoadRedoState = "Charger refaire état"
Hotkeys.DecrementStateSlot = "Décrémenter lemplacement détat"
Hotkeys.IncrementStateSlot = "Incrémenter lemplacement détat"
Hotkeys.FastForward = "Avance rapide (Fast Forward)"
Hotkeys.FrameAdvance = "Image suivante (Frame Advance)"
Hotkeys.DecreaseHDMode7 = "Diminuer le Mode 7 HD"
Hotkeys.IncreaseHDMode7 = "Augmenter le mode 7 HD"
Hotkeys.ToggleSupersampling = "Basculer le superéchantillonnage"
Hotkeys.ResetEmulation = "Réinitialiser lémulation"
Hotkeys.QuitEmulator = "Quitter lémulateur"

View file

@ -0,0 +1,52 @@
Translation.language = "Italian"
Translation.author = "theheroGAC"
Translation.version = "1.2"
Common.Yes = "Si"
Common.No = "No"
Common.Cancel = "Cancella"
Common.Always = "Sempre"
Common.AreYouSure = "Sei sicuro?"
Common.Open = "Apri"
Common.Load = "Carica"
Common.Save = "Salva"
Common.Add = "Aggiungi"
Common.Remove = "Rimuovi"
Common.Delete = "Cancella"
Common.Rename = "Rinomina"
Common.Reset = "Resetta"
Common.Clear = "Pulisci"
Common.None = "Niente"
Common.Disabled = "Disabilita"
Common.Default = "Predefinito"
Common.Name = "Nome"
Common.Date = "Data"
Common.Success = "Successo"
Common.Failure = "Fallito"
Common.Error = "Errore"
Common.Warning = "Attenzione"
Common.Auto = "Automatico"
Common.Video = "Video"
Common.Audio = "Audio"
Common.Fps = "FPS"
Common.Hz = "Hz"
Common.number = "#"
Menu.File = "File"
Menu.File.OpenGame = "Apri un Gioco"
Menu.File.OpenRecentGame = "Apri un gioco lanciato di recente"
Menu.File.OpenRecentGame.ClearList = "Pulisci Lista"
Menu.File.OpenRecentGame.NoRecentGames = "Nessun Gioco Recente"
Menu.File.CloseGame = "Chiudi Gioco"
Menu.File.Exit = "Esci"
Menu.System = "Sistema"
Menu.System.ControllerPort = "Porta del Controller"
Menu.System.ExpansionPort = "Espansione della Porta"
Menu.Settings.Size = "Dimensione"
Menu.Settings.Size.ShrinkWindowToSize = "Riduci la finestra alle dimensioni"
Menu.Settings.Size.CenterWindow = "Finestra centrata"
Menu.Settings.Size.FullScreenMode = "Modalità Schermo intero"
Menu.Settings.Size.PseudoFullScreenMode = "Modalità Pseudo schermo intero"
Menu.Settings.Output = "Output"

View file

@ -1,6 +1,10 @@
Common.Yes = "Si"
Translation.language = "Italian"
Translation.author = "Vecna"
Translation.version = "1.3.3"
Common.Yes = "Sì"
Common.No = "No"
Common.Cancel = "Cancella"
Common.Cancel = "Annulla"
Common.Always = "Sempre"
Common.AreYouSure = "Sei sicuro?"
Common.Open = "Apri"
@ -8,11 +12,11 @@ Common.Load = "Carica"
Common.Save = "Salva"
Common.Add = "Aggiungi"
Common.Remove = "Rimuovi"
Common.Delete = "Cancella"
Common.Delete = "Elimina"
Common.Rename = "Rinomina"
Common.Reset = "Resetta"
Common.Clear = "Pulisci"
Common.None = "Niente"
Common.None = "Nessuno"
Common.Disabled = "Disabilita"
Common.Default = "Predefinito"
Common.Name = "Nome"
@ -30,19 +34,590 @@ Common.number = "#"
Menu.File = "File"
Menu.File.OpenGame = "Apri un Gioco"
Menu.File.OpenRecentGame = "Apri un gioco lanciato di recente"
Menu.File.OpenRecentGame.ClearList = "Pulisci Lista"
Menu.File.OpenRecentGame = "Apri un gioco avviato di recente"
Menu.File.OpenRecentGame.ClearList = "Svuota Lista"
Menu.File.OpenRecentGame.ClearList.confirm.title = "Svuotare la lista dei giochi recenti?"
Menu.File.OpenRecentGame.ClearList.confirm = "Vuoi davvero svuotare la lista dei giochi recenti?"
Menu.File.OpenRecentGame.NoRecentGames = "Nessun Gioco Recente"
Menu.File.CloseGame = "Chiudi Gioco"
Menu.File.Exit = "Esci"
Menu.System = "Sistema"
Menu.System.ControllerPort = "Porta del Controller"
Menu.System.ExpansionPort = "Espansione della Porta"
Menu.System.ExpansionPort = "Porta di Espansione"
Menu.Settings.Size = "Dimensione"
Menu.Settings.Size = "Dimensioni finestra"
Menu.Settings.Size.ShrinkWindowToSize = "Riduci la finestra alle dimensioni"
Menu.Settings.Size.CenterWindow = "Finestra centrata"
Menu.Settings.Size.FullScreenMode = "Modalità Schermo intero"
Menu.Settings.Size.PseudoFullScreenMode = "Modalità Pseudo schermo intero"
Menu.Settings.Output = "Output"
Menu.Settings.Output = "Uscita video"
Menu.Settings.Output.Center = "Centra"
Menu.Settings.Output.PixelPerfect = "Pixel-Perfect"
Menu.Settings.Output.Scale = "Scala"
Menu.Settings.Output.Stretch = "Allarga"
Menu.Settings.Output.AspectRatioCorrection = "Correzione rapporti aspetto"
Menu.Settings.Output.parInsteadOfAr = "8:7 PAR invece di 4:3 AR"
Menu.Settings.Output.ShowOverscanArea = "Mostra larea Overscan"
Menu.Settings.Output.scalingInfo = "Informazioni di scaling nella barra di stato"
Menu.Settings.Output.HiresBlurEmulation = "Emulazione sfocatura in alta risoluzione"
Menu.Settings.Filter = "Filtro video"
Menu.Settings.Shader = "Shader"
Menu.Settings.Shader.Blur = "Sfocatura"
Menu.Settings.MuteAudio = "Muta lAudio"
Menu.Settings.ShowStatusBar = "Mostra la Barra di stato"
Menu.Settings.OpenSettingsFolder = "Apri la cartella delle Impostazioni"
Menu.Help = "Aiuto"
Menu.Help.About = "Informazioni su |"
Settings = "Impostazioni"
Settings.Common.Assign = "Assegna"
Settings.Common.AssignLowercase = "assegna"
Settings.Common.Mapping = "Mappatura"
Settings.Common.MappingAssigned = "Mappatura assegnata."
Settings.Common.PressKeyOrButtonForMapping = "Premi un tasto o un pulsante per mapparlo"
Settings.Common.FrameLowercase = "frame"
Settings.Video.ColorAdjustment = "Regolazione del Colore"
Settings.Video.Luminance = "Luminanza"
Settings.Video.Saturation = "Saturazione"
Settings.Video.Gamma = "Gamma"
Settings.Video.DimVideoWhenIdle = "Video scuro se inattivo"
Settings.Video.DimVideoWhenIdle.tooltip = "Scurisce il video per indicare che lemulazione non è in esecuzione."
Settings.Video.DrawSnowEffectWhenIdle = "Effetto neve se inattivo"
Settings.Audio.Effects = "Effetti"
Settings.Audio.Skew = "Distorsione"
Settings.Audio.Skew.tooltip = "
Regola la frequenza audio della quantità di distorsione (in Hz).
Questo è essenzialmente un controllo statico della frequenza.
Innanzitutto, abilita la sincronizzazione video e audio.
Poi, aumenta o riduci questo valore per cercare di ridurre gli errori.
Da un lato migliorerà il video, ma danneggerà laudio.
Dallaltro lato farà il contrario.
Lidea è trovare la migliore via di mezzo.
Dovresti lasciarlo a 0 quando usi il controllo dinamico della frequenza.
"
Settings.Audio.Volume = "Volume"
Settings.Audio.Volume.tooltip = "
Regola il volume delluscita audio.
Non dovresti usare valori superiori al 100%, se possibile!
In caso contrario, potrebbe verificarsi una distorsione del clipping audio.
"
Settings.Audio.Balance = "Bilanciamento"
Settings.Audio.Balance.tooltip = "
Sposta laudio verso sinistra (valori inferiori) o destra (valori superiori).
50% (centrato) è limpostazione consigliata.
"
Settings.Audio.MuteWhenUnfocused = "Audio muto se si perde il focus"
Settings.Input = "Controlli"
Settings.Input.WhenFocusIsLost = "Quando si perde il focus"
Settings.Input.WhenFocusIsLost.PauseEmulation = "Pausa lemulazione"
Settings.Input.WhenFocusIsLost.BlockInput = "Blocca input"
Settings.Input.WhenFocusIsLost.AllowInput = "Permetti input"
Settings.Input.Port = "Porta"
Settings.Input.Device = "Dispositivo"
Settings.Input.TurboRate = "Turbo rate"
Settings.Input.TurboRate.tooltip = "È il numero di fotogrammi da attendere tra i pulsanti turbo."
Settings.Input.MouseLeft = "Tasto sinistro del mouse"
Settings.Input.MouseMiddle = "Tasto centrale del mouse"
Settings.Input.MouseRight = "Tasto destro del mouse"
Settings.Input.MouseXAxis = "Asse X del mouse"
Settings.Input.MouseYAxis = "Asse Y del mouse"
Settings.Hotkeys = "Scorciatoie"
Settings.Hotkeys.CombinationalLogic = "Logica combinatoria"
Settings.Hotkeys.CombinationalLogic.tooltip = "
Determina se è necessario premere tutte o alcune mappature per attivare le scorciatoie.
Usa “E” se desideri che combinazioni di tasti come Ctrl+F attivino una scorciatoia.
Usa “O” se vuoi che sia la tastiera che un joypad attivino la stessa scorciatoia.
"
Settings.Hotkeys.CombinationalLogic.And = "E"
Settings.Hotkeys.CombinationalLogic.And.tooltip = "Ogni mappatura deve essere premuta per attivare una data scorciatoia."
Settings.Hotkeys.CombinationalLogic.Or = "O"
Settings.Hotkeys.CombinationalLogic.Or.tooltip = "È possibile premere qualsiasi mappatura per attivare una data scorciatoia."
Settings.Hotkeys.Rewind.enableFirst = "Prima, abilita il supporto al riavvolgimento in “Impostazioni” → “Emulatore”"
Settings.BuiltinHotkeys = "Scorciatoie (integrate)"
Settings.Paths = "Percorsi"
Settings.Paths.Games = "Giochi"
Settings.Paths.Patches = "Patch"
Settings.Paths.Saves = "Salvataggi batteria"
Settings.Paths.Cheats = "Cheat"
Settings.Paths.States = "Salvataggi di stato"
Settings.Paths.Screenshots = "Screenshot"
Settings.Paths.LastRecentlyUsed = "lultima usata di recente"
Settings.Paths.SameAsLoadedGame = "la stessa del gioco caricato"
Settings.Emulator = "Emulatore"
Settings.Emulator.General = "Generali"
Settings.Emulator.General.warnOnUnverifiedGames = "Avvisa quando si aprono giochi che non sono stati verificati"
Settings.Emulator.General.autoSaveMemory = "Salva memoria periodicamente"
Settings.Emulator.General.autoSaveStateOnUnload = "Salva lo stato annullato durante il de-caricamento dei giochi"
Settings.Emulator.General.AutoResumeOnLoad = "Ripristina al caricamento"
Settings.Emulator.General.UseNativeFileDialogs = "Usa il file dialog nativo"
Settings.Emulator.FastForward = "Avanti-veloce"
Settings.Emulator.FastForward.FrameSkip = "Salto rame"
Settings.Emulator.FastForward.FrameSkip.tooltip = "
Imposta il numero di fotogrammi da saltare durante lavanzamento veloce.
Il salto dei fotogrammi consente una velocità più elevata nellavanzamento rapido.
"
Settings.Emulator.FastForward.FrameSkip.Frames2to4 = "| frames"
Settings.Emulator.FastForward.FrameSkip.Frames = "| frames"
Settings.Emulator.FastForward.Limiter = "Limitatore"
Settings.Emulator.FastForward.Limiter.tooltip = "Imposta la velocità massima durante lavanti-veloce."
Settings.Emulator.FastForward.mute = "Audio muto se avanti-veloce è attivo"
Settings.Emulator.Rewind = "Riavvolgi"
Settings.Emulator.Rewind.Frequency = "Frequenza"
Settings.Emulator.Rewind.Frequency.everyFrames = "Ogni | frames"
Settings.Emulator.Rewind.Length = "Durata"
Settings.Emulator.Rewind.Length.states = "| stati"
Settings.Emulator.Rewind.mute = "Audio muto mentre riavvolgi"
Settings.Enhancements = "Migliorie"
Settings.Enhancements.FastMode = "Modalità veloce"
Settings.Enhancements.RunAhead = "Esegui in anticipo di"
Settings.Enhancements.RunAhead.Frames = "frame"
Settings.Enhancements.RunAhead.One = "Un"
Settings.Enhancements.RunAhead.Two = "Due"
Settings.Enhancements.RunAhead.Three = "Tre"
Settings.Enhancements.RunAhead.Four = "Quattro"
Settings.Enhancements.Overclocking = "Overclocking"
Settings.Enhancements.Ppu.Video = "video"
Settings.Enhancements.Ppu.Deinterlace = "Deinterlaccia"
Settings.Enhancements.Ppu.NoSpriteLimit = "Nessun limite sprite"
Settings.Enhancements.hdMode7.FastPpuOnly = "solo PPU rapida"
Settings.Enhancements.hdMode7.Scale = "Scalatura"
Settings.Enhancements.hdMode7.PerspectiveCorrection = "Correzione prospettiva"
Settings.Enhancements.hdMode7.Supersampling = "Super-campionamento"
Settings.Enhancements.hdMode7.HdToSdMosaic = "Mosaico HD→SD"
Settings.Enhancements.Dsp.Audio = "audio"
Settings.Enhancements.Dsp.CubicInterpolation = "Interpolazione cubica"
Settings.Enhancements.Coprocessors = "Coprocessori"
Settings.Enhancements.Coprocessors.PreferHle = "Preferire lemulazione di alto livello (HLE)"
Settings.Enhancements.Coprocessors.PreferHle.tooltip = "
Se selezionata, quando disponibile, verrà sempre utilizzata unemulazione HLE meno accurata.
Se deselezionata, HLE verrà utilizzato solo quando manca il firmware per lemulazione di basso livello (LLE).
"
Settings.Enhancements.GameEnhancements = "Migliorie del Gioco"
Settings.Enhancements.GameEnhancements.Hotfixes = "Correzioni"
Settings.Enhancements.GameEnhancements.Hotfixes.tooltip = "
Anche il software con licenza commerciale e rilasciato ufficialmente a volte aveva dei bug.
Questopzione correggerà alcuni problemi che si verificavano anche sullhardware reale.
"
Settings.Compatibility = "Compatibilità"
Settings.Compatibility.entropy = "Entropia (randomizzazione)"
Settings.Compatibility.entropy.None.tooltip = "
Tutta la memoria e i registri vengono inizializzati su valori costanti allavvio.
Usala per migliorare la compatibilità con giochi homebrew demoscene molto vecchi.
"
Settings.Compatibility.entropy.Low = "Bassa"
Settings.Compatibility.entropy.Low.tooltip = "
Tutta la memoria è randomizzata con schemi ripetuti, tutti i registri
sono randomizzati allavvio.
Usala per una più accurata emulazione di un vero SNES.
"
Settings.Compatibility.entropy.High = "Alta"
Settings.Compatibility.entropy.High.tooltip = "
Tutta la memoria e i registri vengono randomizzati il più possibile.
Usala quando sviluppi un nuovo software SNES per assicurarti la massima
compatibilità con lhardware reale.
"
Settings.Compatibility.cpu.Processor = "processore"
Settings.Compatibility.cpu.FastMath = "Matematica rapida"
Settings.Compatibility.cpu.FastMath.tooltip = "
La moltiplicazione e la divisione della CPU richiedono tempo per essere completate su un vero SNES.
I vecchi emulatori non simulavano questi ritardi e fornivano risultati immediatamente.
Alcuni vecchi hack della ROM non aspettano il completamento delle operazioni matematiche e richiedono questo hack.
"
Settings.Compatibility.ppu.Video = "video"
Settings.Compatibility.ppu.NoVramBlocking = "Nessun blocco sulla memoria video (VRAM)"
Settings.Compatibility.ppu.NoVramBlocking.tooltip = "
Questopzione abilita lemulazione di un bug nelle versioni precedenti di ZSNES e Snes9x in cui il blocco VRAM non era emulato.
Alcuni vecchi hack della ROM si basavano su questo comportamento e visualizzeranno la grafica in modo errato se non abilitata.
Non solo questo è estremamente impreciso per lhardware reale, ma danneggia anche la velocità della PPU rapida.
Non abilitare questopzione a meno che non sia necessario giocare a un gioco che, altrimenti, funziona in modo errato.
"
Settings.Compatibility.dsp.Audio = "audio"
Settings.Compatibility.dsp.EchoShadowRam = "Ombreggiatura RAM Echo"
Settings.Compatibility.dsp.EchoShadowRam.tooltip = "
Questopzione abilita lemulazione di un bug in ZSNES in cui la RAM Echo veniva considerata separata dalla RAM APU.
Molti vecchi hack della ROM per “Super Mario World” si basavano su questo comportamento e andranno in crash senza abilitarla.
Tuttavia, è estremamente impreciso per lhardware reale e non dovrebbe essere abilitata se non richiesto.
"
Settings.Drivers = "Driver"
Settings.Drivers.Driver = "Driver"
Settings.Drivers.Change = "Cambia"
Settings.Drivers.Reload = "Ricarica"
Settings.Drivers.ExclusiveMode = "Modalità esclusiva"
Settings.Drivers.Synchronize = "Sincronizza"
Settings.Drivers.ActiveDriver = "Driver attivo"
Settings.Drivers.changeConfirm.title = "Cambiare il driver?"
Settings.Drivers.changeConfirm = "
Attenzione: driver incompatibili possono causare il crash dellapplicazione.
Si consiglia vivamente di scaricare prima il gioco per sicurezza.
Desideri comunque procedere con il cambio driver adesso?
"
Settings.noteGameRestart = "Nota: alcune impostazioni non avranno effetto finché non si ricarica il gioco."
Settings.Drivers.Video.failedToInitialize = "Impossibile inizializzare [|] driver video"
Settings.Drivers.Video.FullScreenMonitor = "Monitor a Schermo Intero"
Settings.Drivers.Video.FullScreenMonitor.tooltip = "Imposta a quale monitor viene inviato il video in modalità a Schermo Intero."
Settings.Drivers.Video.Format = "Formato"
Settings.Drivers.Video.ExclusiveMode.tooltip = "
Fa in modo che la modalità a Schermo Intero occupi tutti i monitor.
Ciò consente alla sincronizzazione adattativa di funzionare meglio e riduce la latenza dellinput.
Tuttavia, gli utenti con più monitor dovrebbero disattivare questopzione.
Nota: anche la modalità esclusiva Direct3D non rispetta il monitor richiesto.
"
Settings.Drivers.Video.Synchronize.tooltip = "
Attende che la scheda video sia pronta prima di eseguire il rendering dei frame.
Elimina i fotogrammi persi o duplicati, ma può distorcere laudio.
Con questopzione, si consiglia di disabilitare la sincronizzazione audio,
e abilitare il controllo dinamico della frequenza. O in alternativa, regola
lopzione audio distorsione per ridurre il buffer under/overflow.
"
Settings.Drivers.Video.GpuSync = "Sincronia GPU"
Settings.Drivers.Video.GpuSync.tooltip = "
(solo driver OpenGL)
Fa sì che la GPU attenda fino al completo rendering dei fotogrammi.
Nel migliore dei casi, questo può rimuovere fino a un frame di input lag.
Tuttavia, causa una riduzione delle prestazioni di circa il 20%.
Dovresti disabilitare questopzione a meno che non la trovi necessaria.
"
Settings.Drivers.Audio.failedToInitialize = "Impossibile inizializzare [|] driver audio"
Settings.Drivers.Audio.OutputDevice = "Dispositivo di uscita"
Settings.Drivers.Audio.SampleRate = "Campionamento"
Settings.Drivers.Audio.Latency = "Latenza"
Settings.Drivers.Audio.ExclusiveMode.tooltip = "
(solo driver WASAPI)
Prende il controllo esclusivo della scheda audio.
Questo può ridurre significativamente la latenza audio.
Tuttavia, bloccherà i suoni di tutte le altre applicazioni.
"
Settings.Drivers.Audio.Synchronize.tooltip = "
Attende che la scheda audio sia pronta prima di inviare i campioni.
Elimina la distorsione audio, ma può distorcere il video.
Con questopzione attivata, si consiglia di disabilitare la sincronizzazione video.
Per ottenere i migliori risultati, usala con un monitor dotato di sincronizzazione adattativa.
"
Settings.Drivers.Audio.DynamicRate = "Frequenza dinamica"
Settings.Drivers.Audio.DynamicRate.tooltip = "
(solo driver OSS, XAudio2, waveOut)
Regola dinamicamente la frequenza audio di piccole quantità.
Usala con la sincronizzazione video abilitata e la sincronizzazione audio disabilitata.
Questo può produrre video perfettamente fluidi e audio pulito,
ma solo se la frequenza di aggiornamento del monitor è impostata correttamente:
60 Hz per i giochi NTSC e 50 Hz per i giochi PAL.
"
Settings.Drivers.Input.failedToInitialize = "Impossibile inizializzare [|] driver input"
Settings.Drivers.Input.Reload.tooltip = "
È possibile utilizzare un ricaricamento del driver per rilevare i dispositivi hotplugged.
Questo è utile per le API che non supportano lauto-hotplug,
come le DirectInput e le SDL.
"
Settings.Drivers.syncModePresets = "Profili Modalità Sincronizzazione"
Settings.Drivers.syncModePresets.requirements = "
Sincronia adattativa: richiede un monitor G-Sync o FreeSync.
Controllo dinamico della frequenza: richiede che le frequenze di aggiornamento di monitor e SNES corrispondano.
"
Settings.Drivers.syncModePresets.AdaptiveSync = "Sincronia adattativa"
Settings.Drivers.syncModePresets.AdaptiveSync.failure = "
Spiacente, la configurazione del driver corrente non è compatibile con la modalità di sincronizzazione adattativa.
La sincronizzazione adattativa richiede il supporto della sincronizzazione audio.
"
Settings.Drivers.syncModePresets.AdaptiveSync.success = "
La sincronizzazione adattativa funziona al meglio nella modalità esclusiva a Schermo Intero.
Usa limpostazione di latenza audio più bassa che il tuo sistema può gestire.
È necessario un monitor G-Sync o FreeSync.
La sincronizzazione adattativa deve essere abilitata nel pannello delle impostazioni del driver.
"
Settings.Drivers.syncModePresets.DynamicRateControl = "Controllo dinamico della frequenza"
Settings.Drivers.syncModePresets.DynamicRateControl.failure = "
Spiacente, lattuale configurazione del driver non è compatibile con la modalità di controllo dinamico della frequenza.
Il controllo dinamico della frequenza richiede la sincronizzazione video e il supporto della frequenza dinamica dellaudio.
"
Settings.Drivers.syncModePresets.DynamicRateControl.success = "
Il controllo dinamico della frequenza richiede che il monitor funzioni a:
60 Hz per i giochi NTSC, 50 Hz per i giochi PAL.
Usa limpostazione di latenza audio più bassa che il tuo sistema può gestire.
"
Settings.BuiltinHotkeys.CheckAll = "Seleziona tutti"
Settings.BuiltinHotkeys.UncheckAll = "Deseleziona tutti"
Tools = "Strumenti"
Tools.SaveState = "Salva Stato"
Tools.SaveState.Slot = "Slot"
Tools.SaveState.Slot.Empty = "vuoto"
Tools.LoadState = "Carica Stato"
Tools.LoadState.SelectedStateSlot = "Slot di stato selezionato"
Tools.LoadState.UndoLastSave = "Annulla ultimo salvataggio"
Tools.LoadState.RedoLastUndo = "Ripeti ultimo salvataggio"
Tools.LoadState.RemoveAllStates = "Rimuovi tutti gli stati"
Tools.LoadState.RemoveAllStates.confirm.title = "Rimuovere gli stati rapidi?"
Tools.LoadState.RemoveAllStates.confirm = "Vuoi davvero rimuovere definitivamente tutti gli stati rapidi per questo gioco?"
Tools.Speed = "Velocità"
Tools.Speed.Slowest = "Bassissima"
Tools.Speed.Slow = "Bassa"
Tools.Speed.Normal = "Normale"
Tools.Speed.Fast = "Alta"
Tools.Speed.Fastest = "Altissima"
Tools.RunMode = "Run Mode"
Tools.RunMode.Normal = "Normale"
Tools.RunMode.PauseEmulation = "Pausa lEmulazione"
Tools.RunMode.FrameAdvance = "Avanzamento frame"
Tools.Movie = "Filmato"
Tools.Movie.Play = "Riproduci"
Tools.Movie.Record = "Registra"
Tools.Movie.ResetAndRecord = "Reset e Registra"
Tools.Movie.Stop = "Interrompi"
Tools.TakeScreenshot = "Acquisisci Screenshot"
Tools.CheatFinder = "Trova Cheat"
Tools.CheatFinder.Address = "Indirizzo"
Tools.CheatFinder.Value = "Valore"
Tools.CheatFinder.Scan = "Scansione"
Tools.CheatFinder.All = "Tutti"
Tools.CheatEditor = "Editor dei Cheat"
Tools.CheatEditor.remove.confirm.title = "Rimuovi cheat?"
Tools.CheatEditor.remove.confirm = "Sei sicuro di voler rimuovere definitivamente i cheat selezionati?"
Tools.CheatEditor.Codes = "Codice(i)"
Tools.CheatEditor.Enable = "Attiva"
Tools.CheatEditor.SelectAll = "Seleziona tutto"
Tools.CheatEditor.UnselectAll = "Deseleziona tutto"
Tools.CheatEditor.AddCheats = "Aggiungi i Cheat"
Tools.CheatEditor.AddCheat = "Aggiungi un Cheat"
Tools.CheatEditor.EditCheat = "Modifica Cheat"
Tools.CheatEditor.Edit = "Modifica"
Tools.CheatEditor.FindCheats = "Trova Cheat"
Tools.CheatEditor.noCheats = "Spiacente, non sono stati trovati cheat per questo gioco."
Tools.CheatEditor.EnableCheats = "Attiva i Cheat"
Tools.CheatEditor.EnableCheats.tooltip = "
Abilitazione principale per tutti i codici cheat.
Se deselezionata, nessun cheat sarà attivo.
Usala per bypassare le aree di gioco che hanno problemi con i cheat.
"
Tools.CheatEditor.EnableCheats.disabled = "Tutti i cheat sono disattivati"
Tools.CheatEditor.EnableCheats.enabled = "I cheat attivi sono abilitati"
Tools.CheatEditor.invalidFormat = "Codici non validi, prego, usare solo i codici nel seguente formato"
Tools.StateManager = "State Manager"
Tools.StateManager.Category = "Categoria"
Tools.StateManager.Category.ManagedStates = "Gestione degli Stati"
Tools.StateManager.Category.QuickStates = "Stati rapidi"
Tools.StateManager.QuickStates.Redo = "Ripeti"
Tools.StateManager.QuickStates.Undo = "Annulla"
Tools.StateManager.Preview = "Anteprima"
Tools.StateManager.AddState = "Aggiungi Stato"
Tools.StateManager.RenameState = "Rinomina Stato"
Tools.StateManager.remove.confirm.title = "Rimuovere stati?"
Tools.StateManager.remove.confirm = "Vuoi davvero rimuovere permanentemente gli stati selezionati?"
Tools.ManifestViewer = "Visualizzatore Manifest"
Tools.ManifestViewer.Manifest = "Manifest"
Game.VerifiedGameOpened = "Gioco avviato e verificato"
Game.GameOpened = "Gioco avviato"
Game.GameClosed = "Gioco chiuso"
Game.GameReset = "Gioco resettato"
Game.AndPatchApplied = " e patch applicata"
Game.GameOpeningCancelled = "Avvio del gioco annullato"
Game.unverifiedGameWarning.title = "Immagine di gioco non verificata"
Game.unverifiedGameWarning = "
Attenzione: questa immagine del gioco non è verificata.
Lesecuzione *potrebbe* essere un rischio per la sicurezza.
Desideri comunque avviare il gioco?
"
Game.unverifiedGameWarning.alwaysQuestion.title = "Disattivare gli avvisi?"
Game.unverifiedGameWarning.alwaysQuestion = "Vuoi disabilitare gli avvisi quando provi ad eseguire giochi non verificati?"
Program.Paused = "In pausa"
Program.Unloaded = "Non caricato"
Program.CapturedScreenshot = "Screenshot acquisito"
Program.Open.MissingRequiredData = "Dati richiesti mancanti"
Program.Load.LoadGameBoyRom = "Carica ROM Game Boy"
Program.Load.GameBoyRoms = "ROM Game Boy"
Program.Load.LoadBsMemoryRom = "Carica ROM BS Memory"
Program.Load.BsMemoryRoms = "ROM BS Memory"
Program.Load.LoadSufamiTurboRomSlot = "Carica ROM Sufami Turbo Slot"
Program.Load.SufamiTurboRoms = "ROM Sufami Turbo"
About.Version = "Versione"
About.Copyright = "Copyright"
About.License = "Licenza"
About.Website = "Sito web"
About.SameBoy.description = "Emulatore Super Game Boy"
About.Bsnes.description = "Emulatore Super Nintendo"
About.Bsnes.copyright = "byuu et al"
About.Bsnes.license = "GPLv3 o successivi"
Browser.OpenSnesRom = "Apri ROM per SNES"
Browser.SnesRoms = "SNES ROM"
Browser.AllFiles = "Tutti i file"
Browser.Select = "Seleziona"
Browser.SelectFolder = "Seleziona cartella"
Browser.ChooseFolder = "Scegli una cartella"
Browser.ShowHidden = "Mostra le cartelle nascoste"
Browser.OpenFile = "Apri un file"
Browser.OpenFiles = "Apri i file"
Browser.OpenFolder = "Apri Cartella"
Browser.OpenObject = "Apri Oggetto"
Browser.Rename.EnterNewFolderName = "Inserire nome nuova cartella"
Browser.Rename.EnterNewFileName = "Inserire nome nuovo file"
Browser.Rename.FailedToRenameFolder = "Impossibile rinominare la cartella."
Browser.Rename.FailedToRenameFile = "Impossibile rinominare il file."
Browser.Create = "Crea"
Browser.Create.EnterName = "Inserire un nome"
Browser.CreateFolder = "Crea cartella"
Browser.CreateFolder.EnterNewFolderName = "Inserire nome nuova cartella"
Browser.Delete.DeleteSelected = "Elimina selezionato"
Browser.Delete.FailedToDelete = "Impossibile eliminare |. Continuare a provare a rimuovere gli elementi rimanenti?"
Browser.Delete.confirm = "Sei sicuro di voler eliminare definitivamente: |"
Browser.Delete.confirm.item = "elemento selezionato"
Browser.Delete.confirm.items = "elementi selezionati"
Browser.SaveFile = "Salva file"
Browser.SaveFile.fileExists.title = "Sovrascrivere il file?"
Browser.SaveFile.fileExists = "File già esistente. Sovrascriverlo?"
StatusIcon.verifiedRom.tooltip = "
Questa è unimmagine del gioco pulita.
Lemulazione PCB è accurata al 100%.
"
StatusIcon.unverifiedRom.tooltip = "
Questa non è unimmagine del gioco verificata.
Lemulazione PCB si basa sulleuristica.
"
ResetDrivers.message.title = "Reset driver"
ResetDrivers.message = "
I driver hardware sono stati ripristinati secondo lopzione della riga di comando: `--resetdrivers`.
Si prega di riconfigurare i driver dalla finestra “Impostazioni” → “Driver” che si aprirà.
"
Rewind.HistoryExhausted = "Riavvolgimento cronologia esaurito"
States.incompatibleFormat = "[|] è in un formato non compatibile"
States.Loaded = "Caricato"
States.NotFound = "[|] non trovato"
States.FailedToSave = "Impossibile salvare [|]"
States.UnableToWriteToDisk = "Impossibile scrivere [|] nel disco"
States.Saved = "Salvato [|]"
Patch.ipsWarning = "
(Vedi questo messaggio perché IPS è un terribile formato di patch e nessuno può essere daccordo sul fatto che le ROM SNES debbano avere lheader o meno.
Considera lidea di chiedere allautore della patch di utilizzare invece il formato BPS.)
Questa patch IPS richiede di essere applicata ad una ROM con lheader?
Se non sei sicuro, prova “No” e se non funziona, riprova con “Sì”.
"
Patch.ensureHeaderless = "Assicurati di utilizzare la ROM corretta (senza header) per questa patch."
Movies.PlayMovie = "Riproduci filmato"
Movies.Movies = "Filmati"
Movies.playbackStarted = "Riproduzione filmato iniziata"
Movies.playbackStopped = "Riproduzione filmato interrotta"
Movies.formatNotSupported = "Formato del filmato non supportata"
Movies.recordingStarted = "Registrazione filmato iniziata"
Movies.SaveMovie = "Salva filmato"
Movies.MovieRecorded = "Filmato registrato"
Movies.MovieNotRecorded = "Filmato non registrato"
Movies.cantRecord = "Il filmato non può essere registrato"
Devices.Gamepad = "Gamepad"
Devices.Mouse = "Mouse"
Hotkeys.ToggleMouseCapture = "Attiva/Disattiva Acquisizione Mouse"
Hotkeys.ToggleCheatCodes = "Attiva/Disattiva i Cheat"
Hotkeys.Rewind = "Riavvolgi"
Hotkeys.LoadUndoState = "Carica Stato Annullato"
Hotkeys.LoadRedoState = "Carica Stato Ripetuto"
Hotkeys.DecrementStateSlot = "Riduci Slot di Stato"
Hotkeys.IncrementStateSlot = "Aumenta Slot di Stato"
Hotkeys.FastForward = "Avanti-veloce"
Hotkeys.FrameAdvance = "Avanzamento frame"
Hotkeys.DecreaseHDMode7 = "Riduci HD Mode 7"
Hotkeys.IncreaseHDMode7 = "Aumenta HD Mode 7"
Hotkeys.ToggleSupersampling = "Attiva/Disattiva Super-campionamento"
Hotkeys.ResetEmulation = "Reset emulazione"
Hotkeys.QuitEmulator = "Chiudi lemulatore"

View file

@ -1,4 +1,8 @@
Common.Yes = "はい"
Translation.language = "Japanese"
Translation.author = "byuu"
Translation.version = "1.0"
Common.Yes = "はい"
Common.No = "いいえ"
Common.Cancel = "キャンセル"
Common.Open = "開く"
@ -36,7 +40,7 @@ Browser.Select = "選択"
Devices.Gamepad = "ゲームパッド"
Devices.Mouse = "マウス"
Devices.SuperMultitap = "スーパーマルチタップ"
Devices.SuperScope = "スーパースコップ"}
Devices.SuperScope = "スーパースコップ"
Devices.Justifier = "1挺のジャスティファイアー"
Devices.Justifiers = "2挺のジャスティファイアー"
Devices.Satellaview = "サテラビュー"

View file

@ -1,4 +1,8 @@
Common.Yes = "Sim"
Translation.language = "Brazilian Portuguese"
Translation.author = "Wellington Uemura (wtuemura)"
Translation.version = "1.3.2"
Common.Yes = "Sim"
Common.No = "Não"
Common.Cancel = "Cancelar"
Common.Always = "Sempre"

View file

@ -1,4 +1,8 @@
Common.Yes = "Да"
Translation.language = "Russian"
Translation.author = "Marat Tanalin"
Translation.version = "1.3"
Common.Yes = "Да"
Common.No = "Нет"
Common.Cancel = "Отмена"
Common.Always = "Всегда"

View file

@ -70,13 +70,10 @@ auto Cartridge::load() -> bool {
/* /MT. */
if(auto loaded = platform->load(ID::SuperFamicom, "Super Famicom", "sfc", {bmt::get("Common.Auto").data(), ntsc, pal})) { // "Auto"
/* MT. */
auto option = loaded.option;
string auto_ = "Auto";
/* /MT. */
auto option = loaded.option; // MT.
information.pathID = loaded.pathID;
information.region = option == auto_ || option == ntsc || option == pal ? option : auto_;
information.region = option == ntsc || option == pal ? option : "Auto";
} else return false;
if(auto fp = platform->open(ID::SuperFamicom, "manifest.bml", File::Read, File::Required)) {

View file

@ -85,14 +85,12 @@ auto InputManager::bindHotkeys() -> void {
program.loadState("Quick/Redo");
}));
char space = ' '; // MT.
hotkeys.append(InputHotkey("Decrement State Slot").onPress([&] {
if (--stateSlot < 1) {
stateSlot = bma::quickStatesNumber;
}
program.showMessage({bmt::get("Tools.LoadState.SelectedStateSlot").data(), space, stateSlot});
program.showMessage({bmt::get("Tools.LoadState.SelectedStateSlot").data(), ' ', stateSlot});
}));
hotkeys.append(InputHotkey("Increment State Slot").onPress([&] {
@ -100,7 +98,7 @@ auto InputManager::bindHotkeys() -> void {
stateSlot = 1;
}
program.showMessage({bmt::get("Tools.LoadState.SelectedStateSlot").data(), space, stateSlot});
program.showMessage({bmt::get("Tools.LoadState.SelectedStateSlot").data(), ' ', stateSlot});
}));
hotkeys.append(InputHotkey("Capture Screenshot").onPress([] {

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity type="win32" name="bsnes-mt" version="1.3.3.0" processorArchitecture="*"/>
<assemblyIdentity type="win32" name="bsnes-mt" version="1.3.4.0" processorArchitecture="*"/>
<dependency>
<dependentAssembly>

View file

@ -10,8 +10,8 @@ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
// Executable version information.
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,3,3,0
PRODUCTVERSION 1,3,3,0
FILEVERSION 1,3,4,0
PRODUCTVERSION 1,3,4,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
#ifdef _DEBUG
FILEFLAGS VS_FF_DEBUG | VS_FF_PRERELEASE
@ -28,10 +28,10 @@ BEGIN
BEGIN
VALUE "CompanyName", "Marat Tanalin"
VALUE "FileDescription", "bsnes-mt by Marat Tanalin"
VALUE "FileVersion", "1.3.3.0"
VALUE "FileVersion", "1.3.4.0"
VALUE "LegalCopyright", "Marat Tanalin | http://tanalin.com"
VALUE "ProductName", "bsnes-mt by Marat Tanalin"
VALUE "ProductVersion", "1.3.3.0"
VALUE "ProductVersion", "1.3.4.0"
END
END
BLOCK "VarFileInfo"

View file

@ -1,93 +0,0 @@
#version 150
// AntiAliased Nearest Neighbor
// by jimbo1qaz and wareya
// Licensed MIT
precision highp float;
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
#define NOT(fl) (1-fl)
#define YES(fl) fl
vec4 vpow(vec4 n, float e)
{
return vec4(pow(n.x, e), pow(n.y, e), pow(n.z, e), pow(n.w, e));
}
vec4 getLQV(vec3 mine) {
return vec4
( mine.r
, mine.g
, mine.b
, mine.r*0.2989 + mine.g*0.5870 + mine.b*0.1140);
}
vec3 fromLQV(vec4 mine) {
float f = mine.w/(mine.r*0.2989 + mine.g*0.5870 + mine.b*0.1140);
return vec3(mine.rgb)*f;
}
vec3 percent(float ssize, float tsize, float coord) {
float minfull = (coord*tsize - 0.5) /tsize*ssize;
float maxfull = (coord*tsize + 0.5) /tsize*ssize;
float realfull = floor(maxfull);
if (minfull > realfull) {
return vec3(1, (realfull+0.5)/ssize, (realfull+0.5)/ssize);
}
return vec3(
(maxfull - realfull) / (maxfull - minfull),
(realfull-0.5) / ssize,
(realfull+0.5) / ssize
);
}
void main() {
float cheapsrgb = 2.1;
float gamma = 3.0;
vec3 xstuff = percent(sourceSize[0].x, targetSize[0].x, texCoord.x);
vec3 ystuff = percent(sourceSize[0].y, targetSize[0].y, texCoord.y);
float xkeep = xstuff[0];
float ykeep = ystuff[0];
// get points to interpolate across, in linear rgb
vec4 a = getLQV(vpow(texture(source[0],vec2(xstuff[1],ystuff[1])), cheapsrgb).rgb);
vec4 b = getLQV(vpow(texture(source[0],vec2(xstuff[2],ystuff[1])), cheapsrgb).rgb);
vec4 c = getLQV(vpow(texture(source[0],vec2(xstuff[1],ystuff[2])), cheapsrgb).rgb);
vec4 d = getLQV(vpow(texture(source[0],vec2(xstuff[2],ystuff[2])), cheapsrgb).rgb);
// use perceptual gamma for luminance component
a.w = pow(a.w, 1/gamma);
b.w = pow(b.w, 1/gamma);
c.w = pow(c.w, 1/gamma);
d.w = pow(d.w, 1/gamma);
// interpolate
vec4 gammaLQVresult =
NOT(xkeep)*NOT(ykeep)*a +
YES(xkeep)*NOT(ykeep)*b +
NOT(xkeep)*YES(ykeep)*c +
YES(xkeep)*YES(ykeep)*d;
// change luminance gamma back to linear
vec4 LQVresult = gammaLQVresult;
LQVresult.w = pow(gammaLQVresult.w, gamma);
// convert back to srgb; lqv -> lrgb -> srgb
vec4 c1 = vpow(vec4(fromLQV(LQVresult), 1), 1/cheapsrgb);
fragColor = c1;
}

View file

@ -1,8 +0,0 @@
input
filter: nearest
program
fragment: AANN.fs
output
filter: nearest

View file

@ -1,297 +0,0 @@
#version 150
/*
CRT-interlaced
Copyright (C) 2010-2012 cgwg, Themaister and DOLLS
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
(cgwg gave their consent to have the original version of this shader
distributed under the GPL in this message:
http://board.byuu.org/viewtopic.php?p=26075#p26075
"Feel free to distribute my shaders under the GPL. After all, the
barrel distortion code was taken from the Curvature shader, which is
under the GPL."
)
This shader variant is pre-configured with screen curvature
*/
//#define INTERLACED
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
uniform int phase;
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
// Comment the next line to disable interpolation in linear gamma (and gain speed).
#define LINEAR_PROCESSING
// Enable screen curvature.
#define CURVATURE
// Enable 3x oversampling of the beam profile
#define OVERSAMPLE
// Use the older, purely gaussian beam profile
//#define USEGAUSSIAN
// vertex params //
// gamma of simulated CRT
#define CRTgamma 2.4
// gamma of display monitor (typically 2.2 is correct)
#define monitorgamma 2.2
// overscan (e.g. 1.02 for 2% overscan)
#define overscan vec2(1.0 , 1.0)//(0.93 , 0.915)
// aspect ratio
#define aspect vec2(1.0, 0.75)
// lengths are measured in units of (approximately) the width of the monitor
// simulated distance from viewer to monitor
#define d 2.0
// radius of curvature
#define R 2.0
// tilt angle in radians
// (behavior might be a bit wrong if both components are nonzero)
#define angle vec2(0.0,-0.0)
// size of curved corners
#define cornersize 0.02
// border smoothness parameter
// decrease if borders are too aliased
#define cornersmooth 80.0
#define sinangle sin(angle)
#define cosangle cos(angle)
#define stretch maxscale()
#define ilfac vec2(1.0, floor(sourceSize[0].y / 200.0))
#define one (ilfac / sourceSize[0].xy)
#define mod_factor (texCoord.x * targetSize.x)
// END of vertex params //
// Macros.
#define FIX(c) max(abs(c), 1e-5);
#define PI 3.141592653589
#ifdef LINEAR_PROCESSING
# define TEX2D(c) pow(texture(source[0], (c)), vec4(CRTgamma))
#else
# define TEX2D(c) texture(source[0], (c))
#endif
#define FIX(c) max(abs(c), 1e-5);
float intersect(vec2 xy)
{
float A = dot(xy,xy)+d*d;
float B = 2.0*(R*(dot(xy,sinangle)-d*cosangle.x*cosangle.y)-d*d);
float C = d*d + 2.0*R*d*cosangle.x*cosangle.y;
return (-B-sqrt(B*B-4.0*A*C))/(2.0*A);
}
vec2 bkwtrans(vec2 xy)
{
float c = intersect(xy);
vec2 point = vec2(c)*xy;
point -= vec2(-R)*sinangle;
point /= vec2(R);
vec2 tang = sinangle/cosangle;
vec2 poc = point/cosangle;
float A = dot(tang,tang)+1.0;
float B = -2.0*dot(poc,tang);
float C = dot(poc,poc)-1.0;
float a = (-B+sqrt(B*B-4.0*A*C))/(2.0*A);
vec2 uv = (point-a*sinangle)/cosangle;
float r = R*acos(a);
return uv*r/sin(r/R);
}
vec2 fwtrans(vec2 uv)
{
float r = FIX(sqrt(dot(uv,uv)));
uv *= sin(r/R)/r;
float x = 1.0-cos(r/R);
float D = d/R + x*cosangle.x*cosangle.y+dot(uv,sinangle);
return d*(uv*cosangle-x*sinangle)/D;
}
vec3 maxscale()
{
vec2 c = bkwtrans(-R * sinangle / (1.0 + R/d*cosangle.x*cosangle.y));
vec2 a = vec2(0.5,0.5)*aspect;
vec2 lo = vec2(fwtrans(vec2(-a.x,c.y)).x,
fwtrans(vec2(c.x,-a.y)).y)/aspect;
vec2 hi = vec2(fwtrans(vec2(+a.x,c.y)).x,
fwtrans(vec2(c.x,+a.y)).y)/aspect;
return vec3((hi+lo)*aspect*0.5,max(hi.x-lo.x,hi.y-lo.y));
}
vec2 transform(vec2 coord)
{
coord = (coord-vec2(0.5))*aspect*stretch.z+stretch.xy;
return (bkwtrans(coord)/overscan/aspect+vec2(0.5));
}
float corner(vec2 coord)
{
coord = (coord - vec2(0.5)) * overscan + vec2(0.5);
coord = min(coord, vec2(1.0)-coord) * aspect;
vec2 cdist = vec2(cornersize);
coord = (cdist - min(coord,cdist));
float dist = sqrt(dot(coord,coord));
return clamp((cdist.x-dist)*cornersmooth,0.0, 1.0);
}
// Calculate the influence of a scanline on the current pixel.
//
// 'distance' is the distance in texture coordinates from the current
// pixel to the scanline in question.
// 'color' is the colour of the scanline at the horizontal location of
// the current pixel.
vec4 scanlineWeights(float distance, vec4 color)
{
// "wid" controls the width of the scanline beam, for each RGB channel
// The "weights" lines basically specify the formula that gives
// you the profile of the beam, i.e. the intensity as
// a function of distance from the vertical center of the
// scanline. In this case, it is gaussian if width=2, and
// becomes nongaussian for larger widths. Ideally this should
// be normalized so that the integral across the beam is
// independent of its width. That is, for a narrower beam
// "weights" should have a higher peak at the center of the
// scanline than for a wider beam.
#ifdef USEGAUSSIAN
vec4 wid = 0.3 + 0.1 * pow(color, vec4(3.0));
vec4 weights = vec4(distance / wid);
return 0.4 * exp(-weights * weights) / wid;
#else
vec4 wid = 2.0 + 2.0 * pow(color, vec4(4.0));
vec4 weights = vec4(distance / 0.3);
return 1.4 * exp(-pow(weights * inversesqrt(0.5 * wid), wid)) / (0.6 + 0.2 * wid);
#endif
}
void main()
{
// Here's a helpful diagram to keep in mind while trying to
// understand the code:
//
// | | | | |
// -------------------------------
// | | | | |
// | 01 | 11 | 21 | 31 | <-- current scanline
// | | @ | | |
// -------------------------------
// | | | | |
// | 02 | 12 | 22 | 32 | <-- next scanline
// | | | | |
// -------------------------------
// | | | | |
//
// Each character-cell represents a pixel on the output
// surface, "@" represents the current pixel (always somewhere
// in the bottom half of the current scan-line, or the top-half
// of the next scanline). The grid of lines represents the
// edges of the texels of the underlying texture.
// Texture coordinates of the texel containing the active pixel.
#ifdef CURVATURE
vec2 xy = transform(texCoord);
#else
vec2 xy = texCoord;
#endif
float cval = corner(xy);
// Of all the pixels that are mapped onto the texel we are
// currently rendering, which pixel are we currently rendering?
#ifdef INTERLACED
vec2 ilvec = vec2(0.0,ilfac.y > 1.5 ? mod(float(phase),2.0) : 0.0);
#else
vec2 ilvec = vec2(0.0,ilfac.y);
#endif
vec2 ratio_scale = (xy * sourceSize[0].xy - vec2(0.5) + ilvec)/ilfac;
#ifdef OVERSAMPLE
float filter_ = sourceSize[0].y / targetSize.y;
#endif
vec2 uv_ratio = fract(ratio_scale);
// Snap to the center of the underlying texel.
xy = (floor(ratio_scale)*ilfac + vec2(0.5) - ilvec) / sourceSize[0].xy;
// Calculate Lanczos scaling coefficients describing the effect
// of various neighbour texels in a scanline on the current
// pixel.
vec4 coeffs = PI * vec4(1.0 + uv_ratio.x, uv_ratio.x, 1.0 - uv_ratio.x, 2.0 - uv_ratio.x);
// Prevent division by zero.
coeffs = FIX(coeffs);
// Lanczos2 kernel.
coeffs = 2.0 * sin(coeffs) * sin(coeffs / 2.0) / (coeffs * coeffs);
// Normalize.
coeffs /= dot(coeffs, vec4(1.0));
// Calculate the effective colour of the current and next
// scanlines at the horizontal location of the current pixel,
// using the Lanczos coefficients above.
vec4 col = clamp(mat4(
TEX2D(xy + vec2(-one.x, 0.0)),
TEX2D(xy),
TEX2D(xy + vec2(one.x, 0.0)),
TEX2D(xy + vec2(2.0 * one.x, 0.0))) * coeffs,
0.0, 1.0);
vec4 col2 = clamp(mat4(
TEX2D(xy + vec2(-one.x, one.y)),
TEX2D(xy + vec2(0.0, one.y)),
TEX2D(xy + one),
TEX2D(xy + vec2(2.0 * one.x, one.y))) * coeffs,
0.0, 1.0);
#ifndef LINEAR_PROCESSING
col = pow(col , vec4(CRTgamma));
col2 = pow(col2, vec4(CRTgamma));
#endif
// Calculate the influence of the current and next scanlines on
// the current pixel.
vec4 weights = scanlineWeights(uv_ratio.y, col);
vec4 weights2 = scanlineWeights(1.0 - uv_ratio.y, col2);
#ifdef OVERSAMPLE
uv_ratio.y =uv_ratio.y+1.0/3.0*filter_;
weights = (weights+scanlineWeights(uv_ratio.y, col))/3.0;
weights2=(weights2+scanlineWeights(abs(1.0-uv_ratio.y), col2))/3.0;
uv_ratio.y =uv_ratio.y-2.0/3.0*filter_;
weights=weights+scanlineWeights(abs(uv_ratio.y), col)/3.0;
weights2=weights2+scanlineWeights(abs(1.0-uv_ratio.y), col2)/3.0;
#endif
vec3 mul_res = (col * weights + col2 * weights2).rgb * vec3(cval);
// dot-mask emulation:
// Output pixels are alternately tinted green and magenta.
vec3 dotMaskWeights = mix(
vec3(1.0, 0.7, 1.0),
vec3(0.7, 1.0, 0.7),
floor(mod(mod_factor, 2.0))
);
mul_res *= dotMaskWeights;
// Convert the image gamma for display on our output device.
mul_res = pow(mul_res, vec3(1.0 / monitorgamma));
// Color the texel.
fragColor = vec4(mul_res, 1.0);
}

View file

@ -1,121 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
in vec4 sourceSize[];
in vec4 targetSize;
out Vertex {
vec2 texCoord;
} vertexOut;
float CRTgamma;
float monitorgamma;
vec2 overscan;
vec2 aspect;
float d;
float R;
float cornersize;
float cornersmooth;
vec3 stretch;
vec2 sinangle;
vec2 cosangle;
vec2 one;
float mod_factor;
vec2 ilfac;
#define FIX(c) max(abs(c), 1e-5);
float intersect(vec2 xy)
{
float A = dot(xy,xy)+d*d;
float B = 2.0*(R*(dot(xy,sinangle)-d*cosangle.x*cosangle.y)-d*d);
float C = d*d + 2.0*R*d*cosangle.x*cosangle.y;
return (-B-sqrt(B*B-4.0*A*C))/(2.0*A);
}
vec2 bkwtrans(vec2 xy)
{
float c = intersect(xy);
vec2 point = vec2(c)*xy;
point -= vec2(-R)*sinangle;
point /= vec2(R);
vec2 tang = sinangle/cosangle;
vec2 poc = point/cosangle;
float A = dot(tang,tang)+1.0;
float B = -2.0*dot(poc,tang);
float C = dot(poc,poc)-1.0;
float a = (-B+sqrt(B*B-4.0*A*C))/(2.0*A);
vec2 uv = (point-a*sinangle)/cosangle;
float r = R*acos(a);
return uv*r/sin(r/R);
}
vec2 fwtrans(vec2 uv)
{
float r = FIX(sqrt(dot(uv,uv)));
uv *= sin(r/R)/r;
float x = 1.0-cos(r/R);
float D = d/R + x*cosangle.x*cosangle.y+dot(uv,sinangle);
return d*(uv*cosangle-x*sinangle)/D;
}
vec3 maxscale()
{
vec2 c = bkwtrans(-R * sinangle / (1.0 + R/d*cosangle.x*cosangle.y));
vec2 a = vec2(0.5,0.5)*aspect;
vec2 lo = vec2(fwtrans(vec2(-a.x,c.y)).x,
fwtrans(vec2(c.x,-a.y)).y)/aspect;
vec2 hi = vec2(fwtrans(vec2(+a.x,c.y)).x,
fwtrans(vec2(c.x,+a.y)).y)/aspect;
return vec3((hi+lo)*aspect*0.5,max(hi.x-lo.x,hi.y-lo.y));
}
void main()
{
// START of parameters
// gamma of simulated CRT
CRTgamma = 2.4;
// gamma of display monitor (typically 2.2 is correct)
monitorgamma = 2.2;
// overscan (e.g. 1.02 for 2% overscan)
overscan = vec2(0.99,0.99);
// aspect ratio
aspect = vec2(1.0, 0.75);
// lengths are measured in units of (approximately) the width of the monitor
// simulated distance from viewer to monitor
d = 2.0;
// radius of curvature
R = 2.0;
// tilt angle in radians
// (behavior might be a bit wrong if both components are nonzero)
const vec2 angle = vec2(0.0,-0.0);
// size of curved corners
cornersize = 0.03;
// border smoothness parameter
// decrease if borders are too aliased
cornersmooth = 80.0;
// END of parameters
vertexOut.texCoord = texCoord.xy;
gl_Position = position;
// Precalculate a bunch of useful values we'll need in the fragment
// shader.
sinangle = sin(angle);
cosangle = cos(angle);
stretch = maxscale();
ilfac = vec2(1.0,floor(sourceSize[0].y/200.0));
// The size of one texel, in texture-coordinates.
one = ilfac / sourceSize[0].xy;
// Resulting X pixel-coordinate of the pixel we're drawing.
mod_factor = texCoord.x * targetSize.x;
}

View file

@ -1,21 +0,0 @@
#version 150
#define distortion 0.08
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
vec2 radialDistortion(vec2 coord) {
vec2 cc = coord - vec2(0.5);
float dist = dot(cc, cc) * distortion;
return coord + cc * (1.0 - dist) * dist;
}
void main(void) {
fragColor = texture(source[0], radialDistortion(texCoord));
}

View file

@ -1,5 +0,0 @@
program
vertex: crt-geom.vs
fragment: crt-geom.fs
modulo: 2

View file

@ -1,32 +0,0 @@
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
// Higher value, more centered glow.
// Lower values might need more taps.
#define GLOW_FALLOFF 0.35
#define TAPS 4
#define kernel(x) exp(-GLOW_FALLOFF * (x) * (x))
void main() {
vec3 col = vec3(0.0);
float dx = 4.0 * sourceSize[0].z; // Mipmapped
float k_total = 0.0;
for (int i = -TAPS; i <= TAPS; i++)
{
float k = kernel(i);
k_total += k;
col += k * texture(source[0], vTexCoord + vec2(float(i) * dx, 0.0)).rgb;
}
FragColor = vec4(col / k_total, 1.0);
}

View file

@ -1,16 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
uniform vec4 targetSize;
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,32 +0,0 @@
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
// Higher value, more centered glow.
// Lower values might need more taps.
#define GLOW_FALLOFF 0.35
#define TAPS 4
#define kernel(x) exp(-GLOW_FALLOFF * (x) * (x))
void main() {
vec3 col = vec3(0.0);
float dy = sourceSize[0].w;
float k_total = 0.0;
for (int i = -TAPS; i <= TAPS; i++)
{
float k = kernel(i);
k_total += k;
col += k * texture(source[0], vTexCoord + vec2(0.0, float(i) * dy)).rgb;
}
FragColor = vec4(col / k_total, 1.0);
}

View file

@ -1,13 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,33 +0,0 @@
#version 150
#define INV_SQRT_2_PI 0.38 // Doesn't have to be accurate.
#define HORIZ_GAUSS_WIDTH 0.5
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 vTexCoord;
float data_pix_no;
float data_one;
};
out vec4 FragColor;
void main() {
float texel = floor(data_pix_no);
float phase = data_pix_no - texel;
float base_phase = phase - 0.5;
vec2 tex = vec2((texel + 0.5) * sourceSize[0].z, vTexCoord.y);
vec3 col = vec3(0.0);
for (int i = -2; i <= 2; i++)
{
float phase = base_phase - float(i);
float g = INV_SQRT_2_PI * exp(-0.5 * phase * phase / (HORIZ_GAUSS_WIDTH * HORIZ_GAUSS_WIDTH)) / HORIZ_GAUSS_WIDTH;
col += texture(source[0], tex + vec2(float(i) * data_one, 0.0)).rgb * g;
}
FragColor = vec4(col, 1.0);
}

View file

@ -1,20 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
float data_pix_no;
float data_one;
};
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
data_pix_no = vTexCoord.x * sourceSize[0].x;
data_one = sourceSize[0].z;
}

View file

@ -1,49 +0,0 @@
#version 150
#define BOOST 1.0
#define CRT_GEOM_BEAM 1
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 vTexCoord;
vec2 data_pix_no;
float data_one;
};
out vec4 FragColor;
vec3 beam(vec3 color, float dist)
{
#if CRT_GEOM_BEAM
vec3 wid = 2.0 + 2.0 * pow(color, vec3(4.0));
vec3 weights = vec3(abs(dist) * 3.333333333);
return 2.0 * color * exp(-pow(weights * inversesqrt(0.5 * wid), wid)) / (0.6 + 0.2 * wid);
#else
float reciprocal_width = 4.0;
vec3 x = dist * reciprocal_width;
return 2.0 * color * exp(-0.5 * x * x) * reciprocal_width;
#endif
}
void main() {
vec2 texel = floor(data_pix_no);
float phase = data_pix_no.y - texel.y;
vec2 tex = vec2(texel + 0.5) * sourceSize[0].zw;
vec3 top = texture(source[0], tex + vec2(0.0, 0 * data_one)).rgb;
vec3 bottom = texture(source[0], tex + vec2(0.0, 1 * data_one)).rgb;
float dist0 = phase;
float dist1 = 1.0 - phase;
vec3 scanline = vec3(0.0);
scanline += beam(top, dist0);
scanline += beam(bottom, dist1);
FragColor = vec4(BOOST * scanline * 0.869565217391304, 1.0);
}

View file

@ -1,20 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
vec2 data_pix_no;
float data_one;
};
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
data_pix_no = vTexCoord.xy * sourceSize[0].xy - vec2(0.0, 0.5);
data_one = sourceSize[0].w;
}

View file

@ -1,13 +0,0 @@
#version 150
uniform sampler2D source[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
void main() {
FragColor = texture(source[0], vTexCoord);
}

View file

@ -1,15 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,15 +0,0 @@
#version 150
#define INPUT_GAMMA 2.2
uniform sampler2D source[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
void main() {
FragColor = pow(texture(source[0], vTexCoord), vec4(INPUT_GAMMA));
}

View file

@ -1,15 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,54 +0,0 @@
input
filter: nearest
program
format: srgb8
filter: nearest
vertex: linearize.vs
fragment: linearize.fs
program
format: srgb8
filter: nearest
height: 25%
width: 100%
vertex: gauss_horiz.vs
fragment: gauss_horiz.fs
program
format: srgb8
filter: nearest
vertex: gauss_vert.vs
fragment: gauss_vert.fs
program
format: srgb8
filter: nearest
height: 100%
width: 100%
vertex: threshold.vs
fragment: threshold.fs
program
format: srgb8
filter: linear
height: 25%
width: 25%
vertex: blur_horiz.vs
fragment: blur_horiz.fs
program
format: srgb8
filter: linear
height: 100%
width: 100%
vertex: blur_vert.vs
fragment: blur_vert.fs
program
filter: linear
vertex: resolve.vs
fragment: resolve.fs
output
filter: linear

View file

@ -1,28 +0,0 @@
#version 150
#define BLOOM_STRENGTH 0.25
#define OUTPUT_GAMMA 2.2
uniform sampler2D source[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
// For debugging
#define BLOOM_ONLY 0
#define CRT_PASS source[3]
void main() {
#if BLOOM_ONLY
vec3 source = BLOOM_STRENGTH * texture(source[0], vTexCoord).rgb;
#else
vec3 source_ = 1.15 * texture(CRT_PASS, vTexCoord).rgb;
vec3 bloom = texture(source[0], vTexCoord).rgb;
source_ += BLOOM_STRENGTH * bloom;
#endif
FragColor = vec4(pow(clamp(source_, 0.0, 1.0), vec3(1.0 / OUTPUT_GAMMA)), 1.0);
}

View file

@ -1,13 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,19 +0,0 @@
#version 150
#define GLOW_WHITEPOINT 1.0
#define GLOW_ROLLOFF 3.0
uniform sampler2D source[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
void main() {
vec3 color = 1.15 * texture(source[0], vTexCoord).rgb;
vec3 factor = clamp(color / GLOW_WHITEPOINT, 0.0, 1.0);
FragColor = vec4(pow(factor, vec3(GLOW_ROLLOFF)), 1.0);
}

View file

@ -1,13 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,306 +0,0 @@
#version 150
// PUBLIC DOMAIN CRT STYLED SCAN-LINE SHADER
//
// by Timothy Lottes
//
// This is more along the style of a really good CGA arcade monitor.
// With RGB inputs instead of NTSC.
// The shadow mask example has the mask rotated 90 degrees for less chromatic aberration.
//
// Left it unoptimized to show the theory behind the algorithm.
//
// It is an example what I personally would want as a display option for pixel art games.
// Please take and use, change, or whatever.
#define hardScan -8.0
#define hardPix -3.0
#define warpX 0.031
#define warpY 0.041
#define maskDark 0.5
#define maskLight 1.5
#define scaleInLinearGamma 1.0
#define shadowMask 3.0
#define brightBoost 1.0
#define hardBloomPix -1.5
#define hardBloomScan -2.0
#define bloomAmount 0.4
#define shape 2.0
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
//Uncomment to reduce instructions with simpler linearization
//(fixes HD3000 Sandy Bridge IGP)
//#define SIMPLE_LINEAR_GAMMA
#define DO_BLOOM 1
// ------------- //
// sRGB to Linear.
// Assuming using sRGB typed textures this should not be needed.
#ifdef SIMPLE_LINEAR_GAMMA
float ToLinear1(float c)
{
return c;
}
vec3 ToLinear(vec3 c)
{
return c;
}
vec3 ToSrgb(vec3 c)
{
return pow(c, vec3(1.0 / 2.2));
}
#else
float ToLinear1(float c)
{
if (scaleInLinearGamma == 0)
return c;
return(c<=0.04045) ? c/12.92 : pow((c + 0.055)/1.055, 2.4);
}
vec3 ToLinear(vec3 c)
{
if (scaleInLinearGamma==0)
return c;
return vec3(ToLinear1(c.r), ToLinear1(c.g), ToLinear1(c.b));
}
// Linear to sRGB.
// Assuming using sRGB typed textures this should not be needed.
float ToSrgb1(float c)
{
if (scaleInLinearGamma == 0)
return c;
return(c<0.0031308 ? c*12.92 : 1.055*pow(c, 0.41666) - 0.055);
}
vec3 ToSrgb(vec3 c)
{
if (scaleInLinearGamma == 0)
return c;
return vec3(ToSrgb1(c.r), ToSrgb1(c.g), ToSrgb1(c.b));
}
#endif
// Nearest emulated sample given floating point position and texel offset.
// Also zero's off screen.
vec3 Fetch(vec2 pos,vec2 off){
pos=(floor(pos*sourceSize[0].xy+off)+vec2(0.5,0.5))/sourceSize[0].xy;
#ifdef SIMPLE_LINEAR_GAMMA
return ToLinear(brightBoost * pow(texture(source[0],pos.xy).rgb, vec3(2.2)));
#else
return ToLinear(brightBoost * texture(source[0],pos.xy).rgb);
#endif
}
// Distance in emulated pixels to nearest texel.
vec2 Dist(vec2 pos)
{
pos = pos*sourceSize[0].xy;
return -((pos - floor(pos)) - vec2(0.5));
}
// 1D Gaussian.
float Gaus(float pos, float scale)
{
return exp2(scale*pow(abs(pos), shape));
}
// 3-tap Gaussian filter along horz line.
vec3 Horz3(vec2 pos, float off)
{
vec3 b = Fetch(pos, vec2(-1.0, off));
vec3 c = Fetch(pos, vec2( 0.0, off));
vec3 d = Fetch(pos, vec2( 1.0, off));
float dst = Dist(pos).x;
// Convert distance to weight.
float scale = hardPix;
float wb = Gaus(dst-1.0,scale);
float wc = Gaus(dst+0.0,scale);
float wd = Gaus(dst+1.0,scale);
// Return filtered sample.
return (b*wb+c*wc+d*wd)/(wb+wc+wd);
}
// 5-tap Gaussian filter along horz line.
vec3 Horz5(vec2 pos,float off){
vec3 a = Fetch(pos,vec2(-2.0, off));
vec3 b = Fetch(pos,vec2(-1.0, off));
vec3 c = Fetch(pos,vec2( 0.0, off));
vec3 d = Fetch(pos,vec2( 1.0, off));
vec3 e = Fetch(pos,vec2( 2.0, off));
float dst = Dist(pos).x;
// Convert distance to weight.
float scale = hardPix;
float wa = Gaus(dst - 2.0, scale);
float wb = Gaus(dst - 1.0, scale);
float wc = Gaus(dst + 0.0, scale);
float wd = Gaus(dst + 1.0, scale);
float we = Gaus(dst + 2.0, scale);
// Return filtered sample.
return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we);
}
// 7-tap Gaussian filter along horz line.
vec3 Horz7(vec2 pos,float off)
{
vec3 a = Fetch(pos, vec2(-3.0, off));
vec3 b = Fetch(pos, vec2(-2.0, off));
vec3 c = Fetch(pos, vec2(-1.0, off));
vec3 d = Fetch(pos, vec2( 0.0, off));
vec3 e = Fetch(pos, vec2( 1.0, off));
vec3 f = Fetch(pos, vec2( 2.0, off));
vec3 g = Fetch(pos, vec2( 3.0, off));
float dst = Dist(pos).x;
// Convert distance to weight.
float scale = hardBloomPix;
float wa = Gaus(dst - 3.0, scale);
float wb = Gaus(dst - 2.0, scale);
float wc = Gaus(dst - 1.0, scale);
float wd = Gaus(dst + 0.0, scale);
float we = Gaus(dst + 1.0, scale);
float wf = Gaus(dst + 2.0, scale);
float wg = Gaus(dst + 3.0, scale);
// Return filtered sample.
return (a*wa+b*wb+c*wc+d*wd+e*we+f*wf+g*wg)/(wa+wb+wc+wd+we+wf+wg);
}
// Return scanline weight.
float Scan(vec2 pos, float off)
{
float dst = Dist(pos).y;
return Gaus(dst + off, hardScan);
}
// Return scanline weight for bloom.
float BloomScan(vec2 pos, float off)
{
float dst = Dist(pos).y;
return Gaus(dst + off, hardBloomScan);
}
// Allow nearest three lines to effect pixel.
vec3 Tri(vec2 pos)
{
vec3 a = Horz3(pos,-1.0);
vec3 b = Horz5(pos, 0.0);
vec3 c = Horz3(pos, 1.0);
float wa = Scan(pos,-1.0);
float wb = Scan(pos, 0.0);
float wc = Scan(pos, 1.0);
return a*wa + b*wb + c*wc;
}
// Small bloom.
vec3 Bloom(vec2 pos)
{
vec3 a = Horz5(pos,-2.0);
vec3 b = Horz7(pos,-1.0);
vec3 c = Horz7(pos, 0.0);
vec3 d = Horz7(pos, 1.0);
vec3 e = Horz5(pos, 2.0);
float wa = BloomScan(pos,-2.0);
float wb = BloomScan(pos,-1.0);
float wc = BloomScan(pos, 0.0);
float wd = BloomScan(pos, 1.0);
float we = BloomScan(pos, 2.0);
return a*wa+b*wb+c*wc+d*wd+e*we;
}
// Distortion of scanlines, and end of screen alpha.
vec2 Warp(vec2 pos)
{
pos = pos*2.0-1.0;
pos *= vec2(1.0 + (pos.y*pos.y)*warpX, 1.0 + (pos.x*pos.x)*warpY);
return pos*0.5 + 0.5;
}
// Shadow mask.
vec3 Mask(vec2 pos)
{
vec3 mask = vec3(maskDark, maskDark, maskDark);
// Very compressed TV style shadow mask.
if (shadowMask == 1.0)
{
float line = maskLight;
float odd = 0.0;
if (fract(pos.x*0.166666666) < 0.5) odd = 1.0;
if (fract((pos.y + odd) * 0.5) < 0.5) line = maskDark;
pos.x = fract(pos.x*0.333333333);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
mask*=line;
}
// Aperture-grille.
else if (shadowMask == 2.0)
{
pos.x = fract(pos.x*0.333333333);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
}
// Stretched VGA style shadow mask (same as prior shaders).
else if (shadowMask == 3.0)
{
pos.x += pos.y*3.0;
pos.x = fract(pos.x*0.166666666);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
}
// VGA style shadow mask.
else if (shadowMask == 4.0)
{
pos.xy = floor(pos.xy*vec2(1.0, 0.5));
pos.x += pos.y*3.0;
pos.x = fract(pos.x*0.166666666);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
}
return mask;
}
void main() {
FragColor = vec4(Bloom(vTexCoord)*bloomAmount, 1.0);
}

View file

@ -1,15 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,18 +0,0 @@
input
filter: nearest
program
filter: nearest
format: srgb8
height: 100%
width: 100%
vertex: bloompass.vs
fragment: bloompass.fs
program
filter: nearest
vertex: scanpass.vs
fragment: scanpass.fs
output
filter: linear

View file

@ -1,317 +0,0 @@
#version 150
// PUBLIC DOMAIN CRT STYLED SCAN-LINE SHADER
//
// by Timothy Lottes
//
// This is more along the style of a really good CGA arcade monitor.
// With RGB inputs instead of NTSC.
// The shadow mask example has the mask rotated 90 degrees for less chromatic aberration.
//
// Left it unoptimized to show the theory behind the algorithm.
//
// It is an example what I personally would want as a display option for pixel art games.
// Please take and use, change, or whatever.
#define hardScan -8.0
#define hardPix -3.0
#define warpX 0.031
#define warpY 0.041
#define maskDark 0.5
#define maskLight 1.5
#define scaleInLinearGamma 1.0
#define shadowMask 3.0
#define brightBoost 1.0
#define hardBloomPix -1.5
#define hardBloomScan -2.0
#define bloomAmount 0.4
#define shape 2.0
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 outputSize;
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
//Uncomment to reduce instructions with simpler linearization
//(fixes HD3000 Sandy Bridge IGP)
//#define SIMPLE_LINEAR_GAMMA
#define DO_BLOOM 1
// ------------- //
// sRGB to Linear.
// Assuming using sRGB typed textures this should not be needed.
#ifdef SIMPLE_LINEAR_GAMMA
float ToLinear1(float c)
{
return c;
}
vec3 ToLinear(vec3 c)
{
return c;
}
vec3 ToSrgb(vec3 c)
{
return pow(c, vec3(1.0 / 2.2));
}
#else
float ToLinear1(float c)
{
if (scaleInLinearGamma == 0)
return c;
return(c<=0.04045) ? c/12.92 : pow((c + 0.055)/1.055, 2.4);
}
vec3 ToLinear(vec3 c)
{
if (scaleInLinearGamma==0)
return c;
return vec3(ToLinear1(c.r), ToLinear1(c.g), ToLinear1(c.b));
}
// Linear to sRGB.
// Assuming using sRGB typed textures this should not be needed.
float ToSrgb1(float c)
{
if (scaleInLinearGamma == 0)
return c;
return(c<0.0031308 ? c*12.92 : 1.055*pow(c, 0.41666) - 0.055);
}
vec3 ToSrgb(vec3 c)
{
if (scaleInLinearGamma == 0)
return c;
return vec3(ToSrgb1(c.r), ToSrgb1(c.g), ToSrgb1(c.b));
}
#endif
// Nearest emulated sample given floating point position and texel offset.
// Also zero's off screen.
vec3 Fetch(vec2 pos,vec2 off){
pos=(floor(pos*sourceSize[0].xy+off)+vec2(0.5,0.5))/sourceSize[0].xy;
#ifdef SIMPLE_LINEAR_GAMMA
return ToLinear(brightBoost * pow(texture(source[1],pos.xy).rgb, vec3(2.2)));
#else
return ToLinear(brightBoost * texture(source[1],pos.xy).rgb);
#endif
}
// Distance in emulated pixels to nearest texel.
vec2 Dist(vec2 pos)
{
pos = pos*sourceSize[0].xy;
return -((pos - floor(pos)) - vec2(0.5));
}
// 1D Gaussian.
float Gaus(float pos, float scale)
{
return exp2(scale*pow(abs(pos), shape));
}
// 3-tap Gaussian filter along horz line.
vec3 Horz3(vec2 pos, float off)
{
vec3 b = Fetch(pos, vec2(-1.0, off));
vec3 c = Fetch(pos, vec2( 0.0, off));
vec3 d = Fetch(pos, vec2( 1.0, off));
float dst = Dist(pos).x;
// Convert distance to weight.
float scale = hardPix;
float wb = Gaus(dst-1.0,scale);
float wc = Gaus(dst+0.0,scale);
float wd = Gaus(dst+1.0,scale);
// Return filtered sample.
return (b*wb+c*wc+d*wd)/(wb+wc+wd);
}
// 5-tap Gaussian filter along horz line.
vec3 Horz5(vec2 pos,float off){
vec3 a = Fetch(pos,vec2(-2.0, off));
vec3 b = Fetch(pos,vec2(-1.0, off));
vec3 c = Fetch(pos,vec2( 0.0, off));
vec3 d = Fetch(pos,vec2( 1.0, off));
vec3 e = Fetch(pos,vec2( 2.0, off));
float dst = Dist(pos).x;
// Convert distance to weight.
float scale = hardPix;
float wa = Gaus(dst - 2.0, scale);
float wb = Gaus(dst - 1.0, scale);
float wc = Gaus(dst + 0.0, scale);
float wd = Gaus(dst + 1.0, scale);
float we = Gaus(dst + 2.0, scale);
// Return filtered sample.
return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we);
}
// 7-tap Gaussian filter along horz line.
vec3 Horz7(vec2 pos,float off)
{
vec3 a = Fetch(pos, vec2(-3.0, off));
vec3 b = Fetch(pos, vec2(-2.0, off));
vec3 c = Fetch(pos, vec2(-1.0, off));
vec3 d = Fetch(pos, vec2( 0.0, off));
vec3 e = Fetch(pos, vec2( 1.0, off));
vec3 f = Fetch(pos, vec2( 2.0, off));
vec3 g = Fetch(pos, vec2( 3.0, off));
float dst = Dist(pos).x;
// Convert distance to weight.
float scale = hardBloomPix;
float wa = Gaus(dst - 3.0, scale);
float wb = Gaus(dst - 2.0, scale);
float wc = Gaus(dst - 1.0, scale);
float wd = Gaus(dst + 0.0, scale);
float we = Gaus(dst + 1.0, scale);
float wf = Gaus(dst + 2.0, scale);
float wg = Gaus(dst + 3.0, scale);
// Return filtered sample.
return (a*wa+b*wb+c*wc+d*wd+e*we+f*wf+g*wg)/(wa+wb+wc+wd+we+wf+wg);
}
// Return scanline weight.
float Scan(vec2 pos, float off)
{
float dst = Dist(pos).y;
return Gaus(dst + off, hardScan);
}
// Return scanline weight for bloom.
float BloomScan(vec2 pos, float off)
{
float dst = Dist(pos).y;
return Gaus(dst + off, hardBloomScan);
}
// Allow nearest three lines to effect pixel.
vec3 Tri(vec2 pos)
{
vec3 a = Horz3(pos,-1.0);
vec3 b = Horz5(pos, 0.0);
vec3 c = Horz3(pos, 1.0);
float wa = Scan(pos,-1.0);
float wb = Scan(pos, 0.0);
float wc = Scan(pos, 1.0);
return a*wa + b*wb + c*wc;
}
// Small bloom.
vec3 Bloom(vec2 pos)
{
vec3 a = Horz5(pos,-2.0);
vec3 b = Horz7(pos,-1.0);
vec3 c = Horz7(pos, 0.0);
vec3 d = Horz7(pos, 1.0);
vec3 e = Horz5(pos, 2.0);
float wa = BloomScan(pos,-2.0);
float wb = BloomScan(pos,-1.0);
float wc = BloomScan(pos, 0.0);
float wd = BloomScan(pos, 1.0);
float we = BloomScan(pos, 2.0);
return a*wa+b*wb+c*wc+d*wd+e*we;
}
// Distortion of scanlines, and end of screen alpha.
vec2 Warp(vec2 pos)
{
pos = pos*2.0-1.0;
pos *= vec2(1.0 + (pos.y*pos.y)*warpX, 1.0 + (pos.x*pos.x)*warpY);
return pos*0.5 + 0.5;
}
// Shadow mask.
vec3 Mask(vec2 pos)
{
vec3 mask = vec3(maskDark, maskDark, maskDark);
// Very compressed TV style shadow mask.
if (shadowMask == 1.0)
{
float line = maskLight;
float odd = 0.0;
if (fract(pos.x*0.166666666) < 0.5) odd = 1.0;
if (fract((pos.y + odd) * 0.5) < 0.5) line = maskDark;
pos.x = fract(pos.x*0.333333333);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
mask*=line;
}
// Aperture-grille.
else if (shadowMask == 2.0)
{
pos.x = fract(pos.x*0.333333333);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
}
// Stretched VGA style shadow mask (same as prior shaders).
else if (shadowMask == 3.0)
{
pos.x += pos.y*3.0;
pos.x = fract(pos.x*0.166666666);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
}
// VGA style shadow mask.
else if (shadowMask == 4.0)
{
pos.xy = floor(pos.xy*vec2(1.0, 0.5));
pos.x += pos.y*3.0;
pos.x = fract(pos.x*0.166666666);
if (pos.x < 0.333) mask.r = maskLight;
else if (pos.x < 0.666) mask.g = maskLight;
else mask.b = maskLight;
}
return mask;
}
void main() {
vec2 pos = Warp(vTexCoord);
vec3 outColor = Tri(pos).rgb;
if (shadowMask > 0.0)
outColor.rgb *= Mask(vTexCoord.xy * outputSize.xy * 1.000001);
#ifdef DO_BLOOM
//Add Bloom
outColor.rgb += mix( vec3(0.0), texture(source[0], pos).rgb, bloomAmount);
#endif
FragColor = vec4(ToSrgb(outColor.rgb), 1.0);
}

View file

@ -1,15 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,214 +0,0 @@
input
filter: nearest
// IMPORTANT:
// Shader passes need to know details about the image in the mask_texture LUT
// files, so set the following constants in user-preset-constants.h accordingly:
// 1.) mask_triads_per_tile = (number of horizontal triads in mask texture LUT's)
// 2.) mask_texture_small_size = (texture size of mask*texture_small LUT's)
// 3.) mask_texture_large_size = (texture size of mask*texture_large LUT's)
// 4.) mask_grille_avg_color = (avg. brightness of mask_grille_texture* LUT's, in [0, 1])
// 5.) mask_slot_avg_color = (avg. brightness of mask_slot_texture* LUT's, in [0, 1])
// 6.) mask_shadow_avg_color = (avg. brightness of mask_shadow_texture* LUT's, in [0, 1])
// Shader passes also need to know certain scales set in this preset, but their
// compilation model doesn't currently allow the preset file to tell them. Make
// sure to set the following constants in user-preset-constants.h accordingly too:
// 1.) bloom_approx_scale_x = scale_x2
// 2.) mask_resize_viewport_scale = vec2(scale_x6, scale_y5)
// Finally, shader passes need to know the value of geom_max_aspect_ratio used to
// calculate scale_y5 (among other values):
// 1.) geom_max_aspect_ratio = (geom_max_aspect_ratio used to calculate scale_y5)
// Pass0: Linearize the input based on CRT gamma and bob interlaced fields.
// (Bobbing ensures we can immediately blur without getting artifacts.)
program
filter: nearest
vertex: first-pass-linearize-crt-gamma-bob-fields.vs
fragment: first-pass-linearize-crt-gamma-bob-fields.fs
format: rgba16f
height: 100%
width: 100%
// Pass1: Resample interlaced (and misconverged) scanlines vertically.
// Separating vertical/horizontal scanline sampling is faster: It lets us
// consider more scanlines while calculating weights for fewer pixels, and
// it reduces our samples from vertical*horizontal to vertical+horizontal.
// This has to come right after ORIG_LINEARIZED, because there's no
// "original_source" scale_type we can use later.
program
filter: linear
vertex: scanlines-vertical-interlacing.vs
fragment: scanlines-vertical-interlacing.fs
height: 400%
width: 100%
format: rgba16f
// Pass2: Do a small resize blur of ORIG_LINEARIZED at an absolute size, and
// account for convergence offsets. We want to blur a predictable portion of the
// screen to match the phosphor bloom, and absolute scale works best for
// reliable results with a fixed-size bloom. Picking a scale is tricky:
// a.) 400x300 is a good compromise for the "fake-bloom" version: It's low enough
// to blur high-res/interlaced sources but high enough that resampling
// doesn't smear low-res sources too much.
// b.) 320x240 works well for the "real bloom" version: It's 1-1.5% faster, and
// the only noticeable visual difference is a larger halation spread (which
// may be a good thing for people who like to crank it up).
// Note the 4:3 aspect ratio assumes the input has cropped geom_overscan (so it's
// *intended* for an ~4:3 aspect ratio).
program
filter: linear
vertex: bloom-approx.vs
fragment: bloom-approx.fs
format: rgba16f
width: 320 px
height: 240 px
// Pass3: Vertically blur the input for halation and refractive diffusion.
// Base this on BLOOM_APPROX: This blur should be small and fast, and blurring
// a constant portion of the screen is probably physically correct if the
// viewport resolution is proportional to the simulated CRT size.
program
filter: linear
vertex: blur9fast-vertical.vs
fragment: blur9fast-vertical.fs
format: rgba16f
height: 100%
width: 100%
// Pass4: Horizontally blur the input for halation and refractive diffusion.
// Note: Using a one-pass 9x9 blur is about 1% slower.
program
filter: linear
vertex: blur9fast-horizontal.vs
fragment: blur9fast-horizontal.fs
format: rgba16f
height: 100%
width: 100%
// Pass5: Lanczos-resize the phosphor mask vertically. Set the absolute
// scale_x5 == mask_texture_small_size.x (see IMPORTANT above). Larger scales
// will blur, and smaller scales could get nasty. The vertical size must be
// based on the viewport size and calculated carefully to avoid artifacts later.
// First calculate the minimum number of mask tiles we need to draw.
// Since curvature is computed after the scanline masking pass:
// num_resized_mask_tiles = 2.0;
// If curvature were computed in the scanline masking pass (it's not):
// max_mask_texel_border = ~3.0 * (1/3.0 + 4.0*sqrt(2.0) + 0.5 + 1.0);
// max_mask_tile_border = max_mask_texel_border/
// (min_resized_phosphor_triad_size * mask_triads_per_tile);
// num_resized_mask_tiles = max(2.0, 1.0 + max_mask_tile_border * 2.0);
// At typical values (triad_size >= 2.0, mask_triads_per_tile == 8):
// num_resized_mask_tiles = ~3.8
// Triad sizes are given in horizontal terms, so we need geom_max_aspect_ratio
// to relate them to vertical resolution. The widest we expect is:
// geom_max_aspect_ratio = 4.0/3.0 // Note: Shader passes need to know this!
// The fewer triads we tile across the screen, the larger each triad will be as a
// fraction of the viewport size, and the larger scale_y5 must be to draw a full
// num_resized_mask_tiles. Therefore, we must decide the smallest number of
// triads we'll guarantee can be displayed on screen. We'll set this according
// to 3-pixel triads at 768p resolution (the lowest anyone's likely to use):
// min_allowed_viewport_triads = 768.0*geom_max_aspect_ratio / 3.0 = 341.333333
// Now calculate the viewport scale that ensures we can draw resized_mask_tiles:
// min_scale_x = resized_mask_tiles * mask_triads_per_tile /
// min_allowed_viewport_triads
// scale_y5 = geom_max_aspect_ratio * min_scale_x
// # Some code might depend on equal scales:
// scale_x6 = scale_y5
// Given our default geom_max_aspect_ratio and min_allowed_viewport_triads:
// scale_y5 = 4.0/3.0 * 2.0/(341.33333 / 8.0) = 0.0625
// IMPORTANT: The scales MUST be calculated in this way. If you wish to change
// geom_max_aspect_ratio, update that constant in user-preset-constants.h!
program
filter: linear
format: rgba16f
width: 64 px
height: 6.25%
vertex: mask-resize-vertical.vs
fragment: mask-resize-vertical.fs
pixmap: textures/TileableLinearApertureGrille15Wide8And5d5SpacingResizeTo64.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearApertureGrille15Wide8And5d5Spacing.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacingResizeTo64.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacing.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearShadowMaskEDPResizeTo64.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearShadowMaskEDP.png
filter: linear
wrap: repeat
// Pass6: Lanczos-resize the phosphor mask horizontally. scale_x6 = scale_y5.
// TODO: Check again if the shaders actually require equal scales.
program
filter: nearest
vertex: mask-resize-horizontal.vs
fragment: mask-resize-horizontal.fs
format: rgba16f
// Pass7: Resample (misconverged) scanlines horizontally, apply halation, and
// apply the phosphor mask.
program
filter: linear
format: rgba16f
height: 100%
width: 100%
vertex: scanlines-horizontal-apply-mask.vs
fragment: scanlines-horizontal-apply-mask.fs
pixmap: textures/TileableLinearApertureGrille15Wide8And5d5SpacingResizeTo64.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearApertureGrille15Wide8And5d5Spacing.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacingResizeTo64.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacing.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearShadowMaskEDPResizeTo64.png
filter: linear
wrap: repeat
pixmap: textures/TileableLinearShadowMaskEDP.png
filter: linear
wrap: repeat
// Pass 8: Compute a brightpass. This will require reading the final mask.
program
filter: linear
format: rgba16f
vertex: brightpass.vs
fragment: brightpass.fs
// Pass 9: Blur the brightpass vertically
program
filter: linear
format: rgba16f
vertex: bloom-vertical.vs
fragment: bloom-vertical.fs
// Pass 10: Blur the brightpass horizontally and combine it with the dimpass:
program
filter: linear
format: rgba16f
height: 100%
width: 100%
vertex: bloom-horizontal-reconstitute.vs
fragment: bloom-horizontal-reconstitute.fs
// Pass 11: Compute curvature/AA:
program
filter: linear
format: rgba16f
vertex: geometry-aa-last-pass.vs
fragment: geometry-aa-last-pass.fs
output
filter: nearest

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -1,52 +0,0 @@
#version 150
////////////////////////////////////////////////////////
// GTU version 0.40
// Author: aliaspider - aliaspider@gmail.com
// License: GPLv3
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// SETTINGS
////////////////////////////////////////////////////////
//#define CROP_OVERSCAN
#define TV_COLOR_LEVELS
//#define COMPOSITE_CONNECTION
//#define NO_SCANLINES
#define TV_HORIZONTAL_RESOLUTION 400.0
#define TV_VERTICAL_RESOLUTION 300.0
#define SIGNAL_RESOLUTION 280.0
#define SIGNAL_RESOLUTION_I 83.0
#define SIGNAL_RESOLUTION_Q 25.0
#define TV_DISPLAY_GAMMA 2.4
#define OUTPUT_DISPLAY_GAMMA 2.2
////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////
#define RGB_to_YIQ mat3x3( 0.299 , 0.595716 , 0.211456 , 0.587 , -0.274453 , -0.522591 , 0.114 , -0.321263 , 0.311135 )
#define YIQ_to_RGB mat3x3( 1.0 , 1.0 , 1.0 , 0.9563 , -0.2721 , -1.1070 , 0.6210 , -0.6474 , 1.7046 )
#define LEVELS(C) clamp((C -16/ 255.0)*255.0/(235.0-16.0),0.0,1.0)
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
void main() {
vec3 c=texture2D(source[0], texCoord.xy).xyz;
#ifdef TV_COLOR_LEVELS
c=LEVELS(c);
#endif
#ifdef COMPOSITE_CONNECTION
c=RGB_to_YIQ*c;
#endif
fragColor = vec4(c, 1.0);
}

View file

@ -1,77 +0,0 @@
#version 150
////////////////////////////////////////////////////////
// GTU version 0.40
// Author: aliaspider - aliaspider@gmail.com
// License: GPLv3
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// SETTINGS
////////////////////////////////////////////////////////
//#define CROP_OVERSCAN
#define TV_COLOR_LEVELS
//#define COMPOSITE_CONNECTION
//#define NO_SCANLINES
#define TV_HORIZONTAL_RESOLUTION 400.0
#define TV_VERTICAL_RESOLUTION 300.0
#define SIGNAL_RESOLUTION 280.0
#define SIGNAL_RESOLUTION_I 83.0
#define SIGNAL_RESOLUTION_Q 25.0
#define TV_DISPLAY_GAMMA 2.4
#define OUTPUT_DISPLAY_GAMMA 2.2
////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////
#define YIQ_to_RGB mat3x3( 1.0 , 1.0 , 1.0 , 0.9563 , -0.2721 , -1.1070 , 0.6210 , -0.6474 , 1.7046 )
#define pi 3.14159265358
#define a(x) abs(x)
#define d(x,b) (pi*b*min(a(x)+0.5,1.0/b))
#define e(x,b) (pi*b*min(max(a(x)-0.5,-1.0/b),1.0/b))
#define STU(x,b) ((d(x,b)+sin(d(x,b))-e(x,b)-sin(e(x,b)))/(2.0*pi))
#define X(i) (offset-(i))
#define GETC (texture(source[0], vec2(texCoord.x - X*sourceSize[0].z,texCoord.y)).xyz)
#ifdef COMPOSITE_CONNECTION
#define VAL vec3((c.x*STU(X,(SIGNAL_RESOLUTION*sourceSize[0].z))),(c.y*STU(X,(SIGNAL_RESOLUTION_I*sourceSize[0].z))),(c.z*STU(X,(SIGNAL_RESOLUTION_Q*sourceSize[0].z))))
#else
#define VAL (c*STU(X,(SIGNAL_RESOLUTION*sourceSize[0].z)))
#endif //COMPOSITE_CONNECTION
#define PROCESS(i) X=X(i);c=GETC;tempColor+=VAL;
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
void main() {
float offset = fract((texCoord.x * sourceSize[0].x) - 0.5);
vec3 tempColor = vec3(0.0);
float X;
vec3 c;
PROCESS(-6)PROCESS(-5)PROCESS(-4)PROCESS(-3)PROCESS(-2)PROCESS(-1)PROCESS( 0)
PROCESS( 7)PROCESS( 6)PROCESS( 5)PROCESS( 4)PROCESS( 3)PROCESS( 2)PROCESS( 1)
#ifdef COMPOSITE_CONNECTION
tempColor=clamp(YIQ_to_RGB*tempColor,0.0,1.0);
#endif
tempColor=clamp(pow(tempColor,vec3(TV_DISPLAY_GAMMA)),0.0,1.0);
fragColor = vec4(tempColor,1.0);
}

View file

@ -1,46 +0,0 @@
#version 150
////////////////////////////////////////////////////////
// GTU version 0.40
// Author: aliaspider - aliaspider@gmail.com
// License: GPLv3
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// SETTINGS
////////////////////////////////////////////////////////
//#define CROP_OVERSCAN
#define TV_COLOR_LEVELS
//#define COMPOSITE_CONNECTION
//#define NO_SCANLINES
#define TV_HORIZONTAL_RESOLUTION 400.0
#define TV_VERTICAL_RESOLUTION 300.0
#define SIGNAL_RESOLUTION 280.0
#define SIGNAL_RESOLUTION_I 83.0
#define SIGNAL_RESOLUTION_Q 25.0
#define TV_DISPLAY_GAMMA 2.4
#define OUTPUT_DISPLAY_GAMMA 2.2
////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////
in vec4 position;
in vec2 texCoord;
out Vertex{
vec2 texCoord;
}vertexOut;
void main(void){
#ifdef CROP_OVERSCAN
gl_Position=position;
gl_Position.x/=(224.0/240.0);
#else
gl_Position=position;
#endif
vertexOut.texCoord=texCoord;
}

View file

@ -1,63 +0,0 @@
#version 150
////////////////////////////////////////////////////////
// GTU version 0.40
// Author: aliaspider - aliaspider@gmail.com
// License: GPLv3
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// SETTINGS
////////////////////////////////////////////////////////
//#define CROP_OVERSCAN
#define TV_COLOR_LEVELS
//#define COMPOSITE_CONNECTION
//#define NO_SCANLINES
#define TV_HORIZONTAL_RESOLUTION 400.0
#define TV_VERTICAL_RESOLUTION 300.0
#define SIGNAL_RESOLUTION 280.0
#define SIGNAL_RESOLUTION_I 83.0
#define SIGNAL_RESOLUTION_Q 25.0
#define TV_DISPLAY_GAMMA 2.4
#define OUTPUT_DISPLAY_GAMMA 2.2
////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////
#define pi 3.14159265358
#define a(x) abs(x)
#define d(x,b) (pi*b*min(a(x)+0.5,1.0/b))
#define e(x,b) (pi*b*min(max(a(x)-0.5,-1.0/b),1.0/b))
#define STU(x,b) ((d(x,b)+sin(d(x,b))-e(x,b)-sin(e(x,b)))/(2.0*pi))
#define X(i) (offset-(i))
#define GETC (texture(source[0], vec2(texCoord.x - X*sourceSize[0].z,texCoord.y)).xyz)
#define VAL (c*STU(X,(TV_HORIZONTAL_RESOLUTION*sourceSize[0].z)))
#define PROCESS(i) X=X(i);c=GETC;tempColor+=VAL;
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
void main() {
float offset = fract((texCoord.x * sourceSize[0].x) - 0.5);
vec3 tempColor = vec3(0.0);
float X;
vec3 c;
PROCESS(-6)PROCESS(-5)PROCESS(-4)PROCESS(-3)PROCESS(-2)PROCESS(-1)PROCESS( 0)
PROCESS( 7)PROCESS( 6)PROCESS( 5)PROCESS( 4)PROCESS( 3)PROCESS( 2)PROCESS( 1)
// tempColor=pow(tempColor,vec3(1.0/2.2));
fragColor = vec4(tempColor,1.0);
}

View file

@ -1,78 +0,0 @@
#version 150
////////////////////////////////////////////////////////
// GTU version 0.40
// Author: aliaspider - aliaspider@gmail.com
// License: GPLv3
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// SETTINGS
////////////////////////////////////////////////////////
//#define CROP_OVERSCAN
#define TV_COLOR_LEVELS
//#define COMPOSITE_CONNECTION
//#define NO_SCANLINES
#define TV_HORIZONTAL_RESOLUTION 400.0
#define TV_VERTICAL_RESOLUTION 300.0
#define SIGNAL_RESOLUTION 280.0
#define SIGNAL_RESOLUTION_I 83.0
#define SIGNAL_RESOLUTION_Q 25.0
#define TV_DISPLAY_GAMMA 2.4
#define OUTPUT_DISPLAY_GAMMA 2.2
////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////
#define SCANLINE_WIDTH (1.5*sourceSize[0].y/TV_VERTICAL_RESOLUTION)
uniform sampler2D source[];
uniform sampler2D texture[];
uniform vec4 sourceSize[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
#define GAMMAOUT(c0) (pow(c0, vec3(1.0/OUTPUTG2)))
#define pi 3.14159265358
#define GAUSS(x,w) ((sqrt(2.0) / (w)) * (exp((-2.0 * pi * (x) * (x)) / ((w) * (w)))))
#define Y(j) (offset.y-(j))
#define a(x) abs(x)
#define d(x,b) (pi*b*min(a(x)+0.5,1.0/b))
#define e(x,b) (pi*b*min(max(a(x)-0.5,-1.0/b),1.0/b))
#define STU(x,b) ((d(x,b)+sin(d(x,b))-e(x,b)-sin(e(x,b)))/(2.0*pi))
#define SOURCE(j) vec2(texCoord.x,texCoord.y - Y(j)*sourceSize[0].w)
#define C(j) (texture2D(source[0], SOURCE(j)).xyz)
#ifdef NO_SCANLINES
#define VAL(j) (C(j)*STU(Y(j),(TV_VERTICAL_RESOLUTION*sourceSize[0].w)))
#else
#define VAL(j) (C(j)*GAUSS(Y(j),SCANLINE_WIDTH))
#endif
void main() {
vec2 offset = fract((texCoord.xy * sourceSize[0].xy) - 0.5);
vec3 tempColor = vec3(0.0);
tempColor+=VAL(-3.0);
tempColor+=VAL(-2.0);
tempColor+=VAL(-1.0);
tempColor+=VAL(0.0);
tempColor+=VAL(1.0);
tempColor+=VAL(2.0);
tempColor+=VAL(3.0);
tempColor+=VAL(4.0);
fragColor = vec4(pow(tempColor,vec3(1.0/OUTPUT_DISPLAY_GAMMA)), 1.0);
}

View file

@ -1,46 +0,0 @@
#version 150
////////////////////////////////////////////////////////
// GTU version 0.40
// Author: aliaspider - aliaspider@gmail.com
// License: GPLv3
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
// SETTINGS
////////////////////////////////////////////////////////
//#define CROP_OVERSCAN
#define TV_COLOR_LEVELS
//#define COMPOSITE_CONNECTION
//#define NO_SCANLINES
#define TV_HORIZONTAL_RESOLUTION 400.0
#define TV_VERTICAL_RESOLUTION 300.0
#define SIGNAL_RESOLUTION 280.0
#define SIGNAL_RESOLUTION_I 83.0
#define SIGNAL_RESOLUTION_Q 25.0
#define TV_DISPLAY_GAMMA 2.4
#define OUTPUT_DISPLAY_GAMMA 2.2
////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////
in vec4 position;
in vec2 texCoord;
out Vertex{
vec2 texCoord;
}vertexOut;
void main(void){
#ifdef CROP_OVERSCAN
gl_Position=position;
gl_Position.y/=(224.0/240.0);
#else
gl_Position=position;
#endif
vertexOut.texCoord=texCoord;
}

View file

@ -1,28 +0,0 @@
program
width: 100%
height: 100%
format: rgba32f
filter: nearest
wrap: edge
fragment: GTU-pass1.fs
program
height: 100%
format: rgba32f
filter: nearest
wrap: edge
vertex: GTU-pass2.vs
fragment: GTU-pass2.fs
program
height: 100%
format: rgba32f
filter: nearest
wrap: edge
fragment: GTU-pass3.fs
program
format: rgba8
filter: nearest
wrap: edge
vertex: GTU-pass4.vs
fragment: GTU-pass4.fs
output
filter: nearest

View file

@ -1,88 +0,0 @@
#version 150
#in red
#in green
#in blue
#in gain
#in gamma
#in blacklevel
#in ambient
#in BGR
#define outgamma 2.2
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
#define fetch_offset(coord,offset) (pow(vec3(gain) * texelFetchOffset(source[0], (coord), 0, (offset)).rgb + vec3(blacklevel), vec3(gamma)) + vec3(ambient))
// integral of (1 - x^2 - x^4 + x^6)^2
const float coeffs_x[] = float[](1.0, -2.0/3.0, -1.0/5.0, 4.0/7.0, -1.0/9.0, -2.0/11.0, 1.0/13.0);
// integral of (1 - 2x^4 + x^6)^2
const float coeffs_y[] = float[](1.0, 0.0, -4.0/5.0, 2.0/7.0, 4.0/9.0, -4.0/11.0, 1.0/13.0);
float intsmear_func(float z, float coeffs[7])
{
float z2 = z*z;
float zn = z;
float ret = 0.0;
for (int i = 0; i < 7; i++) {
ret += zn*coeffs[i];
zn *= z2;
}
return ret;
}
float intsmear(float x, float dx, float d, float coeffs[7])
{
float zl = clamp((x-dx*0.5)/d,-1.0,1.0);
float zh = clamp((x+dx*0.5)/d,-1.0,1.0);
return d * ( intsmear_func(zh,coeffs) - intsmear_func(zl,coeffs) )/dx;
}
void main()
{
vec2 texelSize = 1.0 / sourceSize[0].xy;
vec2 range = sourceSize[0].xy / (targetSize.xy * sourceSize[0].xy);
vec3 cred = pow(red, vec3(outgamma));
vec3 cgreen = pow(green, vec3(outgamma));
vec3 cblue = pow(blue, vec3(outgamma));
ivec2 tli = ivec2(floor(texCoord/texelSize-vec2(0.4999)));
vec3 lcol, rcol;
float subpix = (texCoord.x/texelSize.x - 0.4999 - float(tli.x))*3.0;
float rsubpix = range.x/texelSize.x * 3.0;
lcol = vec3(intsmear(subpix+1.0,rsubpix, 1.5, coeffs_x),
intsmear(subpix ,rsubpix, 1.5, coeffs_x),
intsmear(subpix-1.0,rsubpix, 1.5, coeffs_x));
rcol = vec3(intsmear(subpix-2.0,rsubpix, 1.5, coeffs_x),
intsmear(subpix-3.0,rsubpix, 1.5, coeffs_x),
intsmear(subpix-4.0,rsubpix, 1.5, coeffs_x));
#ifdef BGR
lcol.rgb = lcol.bgr;
rcol.rgb = rcol.bgr;
#endif
float tcol, bcol;
subpix = texCoord.y/texelSize.y - 0.4999 - float(tli.y);
rsubpix = range.y/texelSize.y;
tcol = intsmear(subpix ,rsubpix, 0.63, coeffs_y);
bcol = intsmear(subpix-1.0,rsubpix, 0.63, coeffs_y);
vec3 topLeftColor = fetch_offset(tli, ivec2(0,0)) * lcol * vec3(tcol);
vec3 bottomRightColor = fetch_offset(tli, ivec2(1,1)) * rcol * vec3(bcol);
vec3 bottomLeftColor = fetch_offset(tli, ivec2(0,1)) * lcol * vec3(bcol);
vec3 topRightColor = fetch_offset(tli, ivec2(1,0)) * rcol * vec3(tcol);
vec3 averageColor = topLeftColor + bottomRightColor + bottomLeftColor + topRightColor;
averageColor = mat3x3(cred, cgreen, cblue) * averageColor;
fragColor = vec4(pow(averageColor,vec3(1.0/outgamma)),0.0);
}

View file

@ -1,23 +0,0 @@
settings
persistence: 0.5
red: vec3(1,0,0)
green: vec3(0,1,0)
blue: vec3(0,0,1)
gain: 1.0
gamma: 3.0
blacklevel: 0.05
ambient: 0.0
BGR
input
history: 8
filter: nearest
program
fragment: motion-blur.fs
filter: nearest
width: 100%
height: 100%
program
fragment: lcd-grid.fs

View file

@ -1,23 +0,0 @@
#version 150
uniform sampler2D source[];
uniform sampler2D history[];
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
void main() {
vec4 color = pow(texture(history[7], texCoord).rgba, vec4(2.2));
color = (color + pow(texture(history[6], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(history[5], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(history[4], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(history[3], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(history[2], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(history[1], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(history[0], texCoord).rgba, vec4(2.2))) / 2.0;
color = (color + pow(texture(source[0], texCoord).rgba, vec4(2.2))) / 2.0;
fragColor = pow(color, vec4(1.0 / 2.2));
}

View file

@ -1,24 +0,0 @@
program
width: 100%
height: 100%
filter: nearest
fragment: mdapt-pass1.fs
wrap: edge
program
width: 100%
height: 100%
filter: nearest
fragment: mdapt-pass2.fs
wrap: edge
program
width: 100%
height: 100%
filter: nearest
fragment: mdapt-pass3.fs
wrap: edge
program
width: 100%
height: 100%
filter: nearest
fragment: mdapt-pass4.fs
wrap: edge

View file

@ -1,200 +0,0 @@
// This is a port of the original CG shader to the quark format
// the original shader can be found here :
// https://github.com/libretro/common-shaders/tree/master/dithering/mdapt-4p
/*
Merge Dithering and Pseudo Transparency Shader v1.5 - Pass 1
by Sp00kyFox, 2013
Finds specific patterns and tags their central pixel.
*/
#version 150
//#define HORI
//#define VERT
#define dtt vec3(65536,255,1)
#define eq_threshold 5.0
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
in Vertex{
vec2 texCoord;
};
out vec4 fragColor;
float reduce(vec3 color)
{
return dot(color, dtt);
}
float df(float A, float B)
{
return abs(A-B);
}
bool eq(float A, float B)
{
return (A == B);
}
float remapTo01(float v, float low, float high)
{
return clamp((v - low)/(high-low),0.0,1.0);
}
void main(void) {
vec2 pos = texCoord*sourceSize[0].xy; // pos = pixel position
vec2 dir = sign(pos); // dir = pixel direction
vec2 g1 = dir*vec2(sourceSize[0].z,0.0);
vec2 g2 = dir*vec2(0.0,sourceSize[0].w);;
/*
U3
UUL U2 UUR
ULL UL U1 UR URR
L3 L2 L1 C R1 R2 R3
DLL DL D1 DR DRR
DDL D2 DDR
D3
*/
vec3 c = texture(source[0], texCoord).xyz;
vec3 l1 = texture(source[0], texCoord - g1).xyz;
vec3 l2 = texture(source[0], texCoord - 2*g1).xyz;
vec3 r1 = texture(source[0], texCoord + g1).xyz;
vec3 r2 = texture(source[0], texCoord + 2*g1).xyz;
vec3 u1 = texture(source[0], texCoord - g2).xyz;
vec3 u2 = texture(source[0], texCoord - 2*g2).xyz;
vec3 d1 = texture(source[0], texCoord + g2).xyz;
vec3 d2 = texture(source[0], texCoord + 2*g2).xyz;
vec3 ul = texture(source[0], texCoord - g1 - g2).xyz;
vec3 ur = texture(source[0], texCoord + g1 - g2).xyz;
vec3 dl = texture(source[0], texCoord - g1 + g2).xyz;
vec3 dr = texture(source[0], texCoord + g1 + g2).xyz;
vec3 ull = texture(source[0], texCoord - 2*g1 - g2).xyz;
vec3 uul = texture(source[0], texCoord - g1 - 2*g2).xyz;
vec3 uur = texture(source[0], texCoord + g1 - 2*g2).xyz;
vec3 urr = texture(source[0], texCoord + 2*g1 - g2).xyz;
vec3 drr = texture(source[0], texCoord + 2*g1 + g2).xyz;
vec3 ddr = texture(source[0], texCoord + g1 + 2*g2).xyz;
vec3 ddl = texture(source[0], texCoord - g1 + 2*g2).xyz;
vec3 dll = texture(source[0], texCoord - 2*g1 + g2).xyz;
vec3 l3 = texture(source[0], texCoord - 3*g1).xyz;
vec3 r3 = texture(source[0], texCoord + 3*g1).xyz;
vec3 u3 = texture(source[0], texCoord - 3*g2).xyz;
vec3 d3 = texture(source[0], texCoord + 3*g2).xyz;
float C = reduce( c );
float L1 = reduce( l1 ); float U1 = reduce( u1 );
float L2 = reduce( l2 ); float U2 = reduce( u2 );
float R1 = reduce( r1 ); float D1 = reduce( d1 );
float R2 = reduce( r2 ); float D2 = reduce( d2 );
float UL = reduce( ul ); float L3 = reduce( l3 );
float UR = reduce( ur ); float R3 = reduce( r3 );
float DL = reduce( dl ); float U3 = reduce( u3 );
float DR = reduce( dr ); float D3 = reduce( d3 );
float ULL = reduce( ull ); float DRR = reduce( drr );
float UUL = reduce( uul ); float DDR = reduce( ddr );
float UUR = reduce( uur ); float DDL = reduce( ddl );
float URR = reduce( urr ); float DLL = reduce( dll );
/*
tag values:
0 nothing
checkerboard pattern
9 DL
8 DR
7 UR
6 UL
5 full
horizontal two-line checkerboard
4 bottom line
3 upper line
vertical two-line checkerboard
2 left line
1 right line
one line dither
-1 horizontal
-2 vertical
*/
float type=0;
// checkerboard pattern
if(!eq(C,D1) && !eq(C,U1) && !eq(C,L1) && !eq(C,R1))
{
if(eq(C,UL))
{
if(eq(C,UR))
{
if(eq(C,DR))
{
if(eq(C,DL))
type = 5;
else if(!eq(D1,L1) || eq(D1,DL))
type = 9;
}
else
{
if(eq(C,DL) && (!eq(D1,R1) || eq(D1,DR)))
type = 8;
}
}
else
{
if(eq(C,DR) && eq(C,DL) && (!eq(U1,R1) || eq(U1,UR)))
type = 7;
}
}
else if(eq(C,UR) && eq(C,DR) && eq(C,DL) && (!eq(U1,L1) || eq(U1,UL)))
type = 6;
}
// horizontal two-line checkerboard
else if(eq(C,L2) && eq(C,R2) && eq(C,UL) && eq(C,UR) && !eq(C,L1) && !eq(C,R1) && !eq(C,ULL) && !eq(C,U1) && !eq(C,URR))
{
type = 4;
}
else if(eq(C,L2) && eq(C,R2) && eq(C,DL) && eq(C,DR) && !eq(C,L1) && !eq(C,R1) && !eq(C,DLL) && !eq(C,D1) && !eq(C,DRR))
{
type = 3;
}
// vertical two-line checkerboard
else if(eq(C,U2) && eq(C,D2) && eq(C,UR) && eq(C,DR) && !eq(C,U1) && !eq(C,D1) && !eq(C,R1) && !eq(C,UUR) && !eq(C,DDR))
{
type = 2;
}
else if(eq(C,U2) && eq(C,D2) && eq(C,UL) && eq(C,DL) && !eq(C,U1) && !eq(C,D1) && !eq(C,L1) && !eq(C,UUL) && !eq(C,DDL))
{
type = 1;
}
#ifdef HORI
// horizontal one line dither
else if(eq(C,L2) && eq(C,R2) && eq(L1,R1) && !eq(C,L1) && !eq(C,L3) && !eq(C,R3))
type = -1;
#endif
#ifdef VERT
// vertical one line dither
else if(eq(C,U2) && eq(C,D2) && eq(U1,D1) && !eq(C,U1) && !eq(C,U3) && !eq(C,D3))
type = -2;
#endif
fragColor=vec4(c, remapTo01(type+2, 0, 15));
}

View file

@ -1,161 +0,0 @@
// This is a port of the original CG shader to the quark format
// the original shader can be found here :
// https://github.com/libretro/common-shaders/tree/master/dithering/mdapt-4p
/*
Merge Dithering and Pseudo Transparency Shader v1.5 - Pass 1
by Sp00kyFox, 2013
Finds specific patterns and tags their central pixel.
*/
#version 150
// Radius of the area where the algorithm looks for other detected pixels.
#define rad 2
// Minimal count of detection pixels in search area to be rated as valid.
#define minimum 3
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
in Vertex{
vec2 texCoord;
};
out vec4 fragColor;
float remapTo01(float v, float low, float high)
{
return clamp((v - low)/(high-low),0.0,1.0);
}
float remapFrom01(float v, float low, float high)
{
return round(mix(low, high, v));
}
void main(void) {
vec2 pos = texCoord*sourceSize[0].xy; // pos = pixel position
vec2 dir = sign(pos); // dir = pixel direction
vec2 g1 = dir*vec2(sourceSize[0].z,0.0);
vec2 g2 = dir*vec2(0.0,sourceSize[0].w);
vec4 CC = texture(source[0], texCoord).xyzw;
float C = remapFrom01(CC.w, 0, 15) - 2;
if(C == 0){
fragColor=CC;
return;
}
/*
tag values:
0 nothing
checkerboard pattern
9 DL
8 DR
7 UR
6 UL
5 full
horizontal two-line checkerboard
4 bottom line
3 upper line
vertical two-line checkerboard
2 left line
1 right line
one line dither
-1 horizontal
-2 vertical
*/
int hits = 0;
if(C > 0)
{
// for(int x=-rad; x<=rad; x++)
// {
// for(int y=-rad; y<=rad; y++)
// {
// hits += ((remapFrom01(texture(source[0], texCoord + (x*g1) + (y*g2)).x, 0, 15) - 2) > 0) ? 1 : 0;
// }
// }
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + (-2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + (-1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + ( 0*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + ( 1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + ( 2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + (-2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + (-1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + ( 0*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + ( 1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + ( 2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + (-2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + (-1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + ( 0*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + ( 1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + ( 2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + (-2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + (-1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + ( 0*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + ( 1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + ( 2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + (-2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + (-1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + ( 0*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + ( 1*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + ( 2*g2)).w, 0, 15) - 2) > 0) ? 1 : 0;
}
else
{
// for(int x=-rad; x<=rad; x++)
// {
// for(int y=-rad; y<=rad; y++)
// {
// hits += ((remapFrom01(texture(source[0], texCoord + (x*g1) + (y*g2)).x, 0, 15) - 2) == C) ? 1 : 0;
// }
// }
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + (-2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + (-1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + ( 0*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + ( 1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-2*g1) + ( 2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + (-2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + (-1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + ( 0*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + ( 1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + (-1*g1) + ( 2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + (-2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + (-1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + ( 0*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + ( 1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 0*g1) + ( 2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + (-2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + (-1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + ( 0*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + ( 1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 1*g1) + ( 2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + (-2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + (-1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + ( 0*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + ( 1*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
hits += ((remapFrom01(texture(source[0], texCoord + ( 2*g1) + ( 2*g2)).w, 0, 15) - 2) == C) ? 1 : 0;
fragColor=CC;
return;
}
if(hits < minimum)
fragColor=vec4(CC.xyz, remapTo01(2, 0, 15));
else
fragColor=CC;
}

View file

@ -1,175 +0,0 @@
// This is a port of the original CG shader to the quark format
// the original shader can be found here :
// https://github.com/libretro/common-shaders/tree/master/dithering/mdapt-4p
/*
Merge Dithering and Pseudo Transparency Shader v1.5 - Pass 3
by Sp00kyFox, 2013
Tags the rest of the detected pattern from pass 1.
*/
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
in Vertex{
vec2 texCoord;
};
out vec4 fragColor;
float remapTo01(float v, float low, float high)
{
return clamp((v - low)/(high-low),0.0,1.0);
}
float remapFrom01(float v, float low, float high)
{
return round(mix(low, high, v));
}
void main(void) {
vec2 pos = texCoord*sourceSize[0].xy; // pos = pixel position
vec2 dir = sign(pos); // dir = pixel direction
vec2 g1 = dir*vec2(sourceSize[0].z,0.0);
vec2 g2 = dir*vec2(0.0,sourceSize[0].w);
/*
U2
UL U1 UR
L2 L1 xC R1 R2
DL D1 DR
D2
*/
vec4 xC = texture(source[0], texCoord).xyzw;
vec4 xL1 = texture(source[0], texCoord - g1).xyzw;
vec4 xL2 = texture(source[0], texCoord - 2*g1).xyzw;
vec4 xR1 = texture(source[0], texCoord + g1).xyzw;
vec4 xR2 = texture(source[0], texCoord + 2*g1).xyzw;
vec4 xU1 = texture(source[0], texCoord - g2).xyzw;
vec4 xU2 = texture(source[0], texCoord - 2*g2).xyzw;
vec4 xD1 = texture(source[0], texCoord + g2).xyzw;
vec4 xD2 = texture(source[0], texCoord + 2*g2).xyzw;
vec4 xUL = texture(source[0], texCoord - g1 - g2).xyzw;
vec4 xUR = texture(source[0], texCoord + g1 - g2).xyzw;
vec4 xDL = texture(source[0], texCoord - g1 + g2).xyzw;
vec4 xDR = texture(source[0], texCoord + g1 + g2).xyzw;
float C = remapFrom01(xC.w, 0, 15) - 2;
float L1 = remapFrom01(xL1.w, 0, 15) - 2;
float L2 = remapFrom01(xL2.w, 0, 15) - 2;
float R1 = remapFrom01(xR1.w, 0, 15) - 2;
float R2 = remapFrom01(xR2.w, 0, 15) - 2;
float U1 = remapFrom01(xU1.w, 0, 15) - 2;
float U2 = remapFrom01(xU2.w, 0, 15) - 2;
float D1 = remapFrom01(xD1.w, 0, 15) - 2;
float D2 = remapFrom01(xD2.w, 0, 15) - 2;
float UL = remapFrom01(xUL.w, 0, 15) - 2;
float UR = remapFrom01(xUR.w, 0, 15) - 2;
float DL = remapFrom01(xDL.w, 0, 15) - 2;
float DR = remapFrom01(xDR.w, 0, 15) - 2;
/*
tag values:
0 nothing
checkerboard pattern
9 DL
8 DR
7 UR
6 UL
5 full
horizontal two-line checkerboard
4 bottom line
3 upper line
vertical two-line checkerboard
2 left line
1 right line
one line dither
-1 horizontal
-2 vertical
*/
// checkerboard pattern
if(U1 == 5 || D1 == 5 || L1 == 5 || R1 == 5 || UL == 5 || UR == 5 || DR == 5 || DL == 5)
{
fragColor=vec4(xC.xyz, remapTo01(5+2, 0, 15));
return ;
}
if(U1 == 6 || L1 == 6 || UL == 6 || UR == 6 || DL == 6) // UL
{
fragColor=vec4(xC.xyz, remapTo01(6+2, 0, 15));
return ;
}
if(U1 == 7 || R1 == 7 || UL == 7 || UR == 7 || DR == 7) // UR
{
fragColor=vec4(xC.xyz, remapTo01(7+2, 0, 15));
return ;
}
if(D1 == 8 || R1 == 8 || UR == 8 || DR == 8 || DL == 8) // DR
{
fragColor=vec4(xC.xyz, remapTo01(8+2, 0, 15));
return ;
}
if(D1 == 9 || L1 == 9 || UL == 9 || DR == 9 || DL == 9) // DL
{
fragColor=vec4(xC.xyz, remapTo01(9+2, 0, 15));
return ;
}
// horizontal two-line checkerboard
if (L2 == 4 || L1 == 4 || R1 == 4 || R2 == 4 || DL == 4 || D1 == 4 || DR == 4)
{
fragColor=vec4(xC.xyz, remapTo01(4+2, 0, 15));
return ;
}
if (L2 == 3 || L1 == 3 || R1 == 3 || R2 == 3 || UL == 3 || U1 == 3 || UR == 3)
{
fragColor=vec4(xC.xyz, remapTo01(3+2, 0, 15));
return ;
}
// vertical two-line checkerboard
if (U2 == 2 || U1 == 2 || D1 == 2 || D2 == 2 || UL == 2 || L1 == 2 || DL == 2)
{
fragColor=vec4(xC.xyz, remapTo01(2+2, 0, 15));
return ;
}
if (U2 == 1 || U1 == 1 || D1 == 1 || D2 == 1 || UR == 1 || R1 == 1 || DR == 1)
{
fragColor=vec4(xC.xyz, remapTo01(1+2, 0, 15));
return ;
}
if(C > 0){
fragColor=xC;
return ;
}
// horizontal one line dither
if (L2 == -1 || L1 == -1 || R1 == -1 || R2 == -1)
{
fragColor=vec4(xC.xyz, remapTo01(-1+2, 0, 15));
return ;
}
// vertical one line dither
if (U2 == -2 || U1 == -2 || D1 == -2 || D2 == -2)
{
fragColor=vec4(xC.xyz, remapTo01(-2+2, 0, 15));
return;
}
fragColor=xC;
}

View file

@ -1,192 +0,0 @@
// This is a port of the original CG shader to the quark format
// the original shader can be found here :
// https://github.com/libretro/common-shaders/tree/master/dithering/mdapt-4p
/*
Merge Dithering and Pseudo Transparency Shader v1.5 - Pass 4
by Sp00kyFox, 2013
Blends tagged pixels with tagged neighbors.
*/
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
in Vertex{
vec2 texCoord;
};
out vec4 fragColor;
bool eq(vec4 A, vec4 B)
{
return (A.x == B.x && A.y == B.y && A.z == B.z);
}
float remapFrom01(float v, float low, float high)
{
return round(mix(low, high, v));
}
vec3 merge3(vec4 C, vec4 A, vec4 B, float tag)
{
if(A.w == tag)
{
if(B.w == tag)
return 0.5*C.xyz + 0.25*(A.xyz + B.xyz);
else
return 0.5*(C.xyz + A.xyz);
}
else if(B.w == tag)
return 0.5*(C.xyz + B.xyz);
else
return C.xyz;
}
vec3 merge9(vec4 C, vec4 UL, vec4 UR, vec4 DL, vec4 DR, vec4 U1, vec4 D1, vec4 L1, vec4 R1)
{
//return 0.25*C.xyz + 0.0625*(UL.xyz + UR.xyz + DR.xyz + DL.xyz) + 0.125*(L1.xyz + R1.xyz + D1.xyz + U1.xyz);
vec3 B = vec3(0.0);
vec3 W = vec3(0.0);
float cntB = 0;
float cntW = 0;
if(UL.w > 0 || eq(UL,C) || (D1.w > 0 && eq(UL,D1)) || (R1.w > 0 && eq(UL,R1)) )
{
B = B+UL.xyz;
cntB++;
}
if(UR.w > 0 || eq(UR,C) || (D1.w > 0 && eq(UR,D1)) || (L1.w > 0 && eq(UR,L1)) )
{
B = B+UR.xyz;
cntB++;
}
if(DL.w > 0 || eq(DL,C) || (U1.w > 0 && eq(DL,U1)) || (R1.w > 0 && eq(DL,R1)) )
{
B = B+DL.xyz;
cntB++;
}
if(DR.w > 0 || eq(DR,C) || (U1.w > 0 && eq(DR,U1)) || (L1.w > 0 && eq(DR,L1)) )
{
B = B+DR.xyz;
cntB++;
}
if(U1.w > 0 || eq(U1,C) || (D1.w > 0 && eq(U1,D1)) )
{
W = W+U1.xyz;
cntW++;
}
if(D1.w > 0 || eq(D1,C) || (U1.w > 0 && eq(D1,U1)) )
{
W = W+D1.xyz;
cntW++;
}
if(L1.w > 0 || eq(L1,C) || (R1.w > 0 && eq(L1,R1)) )
{
W = W+L1.xyz;
cntW++;
}
if(R1.w > 0 || eq(R1,C) || (L1.w > 0 && eq(R1,L1)) )
{
W = W+R1.xyz;
cntW++;
}
if(cntB == 0)
{
if(cntW == 0)
return C.xyz;
else
return 0.5*C.xyz + (1/(cntW*2))*W;
}
if(cntW == 0)
return 0.5*C.xyz + (1/(cntB*2))*B;
else
return 0.25*C.xyz + (1/(cntB*4))*B + (1/(cntW*2))*W;
}
void main(void) {
vec2 pos = texCoord*sourceSize[0].xy; // pos = pixel position
vec2 dir = sign(pos); // dir = pixel direction
vec2 g1 = dir*vec2(sourceSize[0].z,0.0);
vec2 g2 = dir*vec2(0.0,sourceSize[0].w);
/*
UL U1 UR
L1 C R1
DL D1 DR
*/
vec4 C = texture(source[0], texCoord).xyzw;
vec4 L1 = texture(source[0], texCoord - g1).xyzw;
vec4 R1 = texture(source[0], texCoord + g1).xyzw;
vec4 U1 = texture(source[0], texCoord - g2).xyzw;
vec4 D1 = texture(source[0], texCoord + g2).xyzw;
vec4 UL = texture(source[0], texCoord - g1 - g2).xyzw;
vec4 UR = texture(source[0], texCoord + g1 - g2).xyzw;
vec4 DL = texture(source[0], texCoord - g1 + g2).xyzw;
vec4 DR = texture(source[0], texCoord + g1 + g2).xyzw;
C.w = remapFrom01(C.w, 0, 15) - 2;
L1.w = remapFrom01(L1.w, 0, 15) - 2;
R1.w = remapFrom01(R1.w, 0, 15) - 2;
U1.w = remapFrom01(U1.w, 0, 15) - 2;
D1.w = remapFrom01(D1.w, 0, 15) - 2;
UL.w = remapFrom01(UL.w, 0, 15) - 2;
UR.w = remapFrom01(UR.w, 0, 15) - 2;
DL.w = remapFrom01(DL.w, 0, 15) - 2;
DR.w = remapFrom01(DR.w, 0, 15) - 2;
/*
tag values:
0 nothing
checkerboard pattern
9 DL
8 DR
7 UR
6 UL
5 full
horizontal two-line checkerboard
4 bottom line
3 upper line
vertical two-line checkerboard
2 left line
1 right line
one line dither
-1 horizontal
-2 vertical
*/
// checkerboard pattern
if(C.w > 0){
fragColor=vec4(merge9(C,UL,UR,DL,DR,U1,D1,L1,R1),0);
return;
}
// horizontal one line dither
if(C.w == -1){
fragColor=vec4(merge3(C,L1,R1,-1),0);
return;
}
// vertical one line dither
if(C.w == -2){
fragColor=vec4(merge3(C,U1,D1,-2),0);
return;
}
fragColor=vec4(C.xyz, 1.0);
}

View file

@ -1,229 +0,0 @@
#version 150
// This is a port of the NTSC encode/decode shader pair in MAME and MESS, modified to use only
// one pass rather than an encode pass and a decode pass. It accurately emulates the sort of
// signal decimation one would see when viewing a composite signal, though it could benefit from a
// pre-pass to re-size the input content to more accurately reflect the actual size that would
// be incoming from a composite signal source.
//
// To encode the composite signal, I convert the RGB value to YIQ, then subsequently evaluate
// the standard NTSC composite equation. Four composite samples per RGB pixel are generated from
// the incoming linearly-interpolated texels.
//
// The decode pass implements a Fixed Impulse Response (FIR) filter designed by MAME/MESS contributor
// "austere" in matlab (if memory serves correctly) to mimic the behavior of a standard television set
// as closely as possible. The filter window is 83 composite samples wide, and there is an additional
// notch filter pass on the luminance (Y) values in order to strip the color signal from the luminance
// signal prior to processing.
//
// Yes, this code could greatly use some cleaning up.
// ported from UltraMoogleMan's "Full MAME/MESS Shader Pipe" shadertoy: https://www.shadertoy.com/view/ldf3Rf
// license: presumably MAME's license at the time, which was noncommercial
uniform sampler2D source[];
uniform vec4 sourceSize[];
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
// Useful Constants
const vec4 Zero = vec4(0.0);
const vec4 Half = vec4(0.5);
const vec4 One = vec4(1.0);
const vec4 Two = vec4(2.0);
const vec3 Gray = vec3(0.3, 0.59, 0.11);
const float Pi = 3.1415926535;
const float Pi2 = 6.283185307;
// NTSC Constants
const vec4 A = vec4(0.5);
const vec4 A2 = vec4(1.0);
const vec4 B = vec4(0.5);
const float P = 1.0;
const float CCFrequency = 3.59754545;
const float NotchUpperFrequency = 5.59754545; //3.59754545 + 2.0;
const float NotchLowerFrequency = 1.59754545; //3.59754545 - 2.0;
const float YFrequency = 6.0;
const float IFrequency = 1.2;
const float QFrequency = 0.6;
const float NotchHalfWidth = 2.0;
const float ScanTime = 52.6;
const float Pi2ScanTime = 330.4955471482;// 6.283185307 * 52.6;
const float MaxC = 2.1183;
const vec4 YTransform = vec4(0.299, 0.587, 0.114, 0.0);
const vec4 ITransform = vec4(0.595716, -0.274453, -0.321263, 0.0);
const vec4 QTransform = vec4(0.211456, -0.522591, 0.311135, 0.0);
const vec3 YIQ2R = vec3(1.0, 0.956, 0.621);
const vec3 YIQ2G = vec3(1.0, -0.272, -0.647);
const vec3 YIQ2B = vec3(1.0, -1.106, 1.703);
const vec4 MinC = vec4(-1.1183);
const vec4 CRange = vec4(3.2366);
const vec4 InvCRange = vec4(1.0/3.2366);
const float Pi2Length = Pi2 / 63.0;
const vec4 NotchOffset = vec4(0.0, 1.0, 2.0, 3.0);
vec4 W = vec4(Pi2 * CCFrequency * ScanTime);
// Color Convolution Constants
const vec3 RedMatrix = vec3(1.0, 0.0, 0.0);
const vec3 GrnMatrix = vec3(0.0, 1.0, 0.0);
const vec3 BluMatrix = vec3(0.0, 0.0, 1.0);
const vec3 DCOffset = vec3(0.0, 0.0, 0.0);
const vec3 ColorScale = vec3(0.95, 0.95, 0.95);
const float Saturation = 1.4;
// Deconverge Constants
const vec3 ConvergeX = vec3(-0.4, 0.0, 0.2);
const vec3 ConvergeY = vec3( 0.0, -0.4, 0.2);
const vec3 RadialConvergeX = vec3(1.0, 1.0, 1.0);
const vec3 RadialConvergeY = vec3(1.0, 1.0, 1.0);
// Scanline/Pincushion Constants
const float PincushionAmount = 0.015;
const float CurvatureAmount = 0.015;
//const float ScanlineAmount = 0.175; <- move to parameter
const float ScanlineScale = 1.0;
const float ScanlineHeight = 1.0;
const float ScanlineBrightScale = 1.0;
const float ScanlineBrightOffset = 0.0;
const float ScanlineOffset = 0.0;
const vec3 Floor = vec3(0.05, 0.05, 0.05);
// 60Hz Bar Constants
const float SixtyHertzRate = (60.0 / 59.97 - 1.0); // Difference between NTSC and line frequency
const float SixtyHertzScale = 0.1;
vec4 CompositeSample(vec2 UV, vec2 InverseRes) {
vec2 InverseP = vec2(P, 0.0) * InverseRes;
// UVs for four linearly-interpolated samples spaced 0.25 texels apart
vec2 C0 = UV;
vec2 C1 = UV + InverseP * 0.25;
vec2 C2 = UV + InverseP * 0.50;
vec2 C3 = UV + InverseP * 0.75;
vec4 Cx = vec4(C0.x, C1.x, C2.x, C3.x);
vec4 Cy = vec4(C0.y, C1.y, C2.y, C3.y);
vec4 Texel0 = texture(source[0], C0);
vec4 Texel1 = texture(source[0], C1);
vec4 Texel2 = texture(source[0], C2);
vec4 Texel3 = texture(source[0], C3);
float Frequency = CCFrequency;
//Frequency = Frequency;// Uncomment for bad color sync + (sin(UV.y * 2.0 - 1.0) / CCFrequency) * 0.001;
// Calculated the expected time of the sample.
vec4 T = A2 * Cy * vec4(sourceSize[0].y) + B + Cx;
vec4 W = vec4(Pi2ScanTime * Frequency);
vec4 TW = T * W;
vec4 Y = vec4(dot(Texel0, YTransform), dot(Texel1, YTransform), dot(Texel2, YTransform), dot(Texel3, YTransform));
vec4 I = vec4(dot(Texel0, ITransform), dot(Texel1, ITransform), dot(Texel2, ITransform), dot(Texel3, ITransform));
vec4 Q = vec4(dot(Texel0, QTransform), dot(Texel1, QTransform), dot(Texel2, QTransform), dot(Texel3, QTransform));
vec4 Encoded = Y + I * cos(TW) + Q * sin(TW);
return (Encoded - MinC) * InvCRange;
}
vec4 NTSCCodec(vec2 UV, vec2 InverseRes)
{
vec4 YAccum = Zero;
vec4 IAccum = Zero;
vec4 QAccum = Zero;
float QuadXSize = sourceSize[0].x * 4.0;
float TimePerSample = ScanTime / QuadXSize;
// Frequency cutoffs for the individual portions of the signal that we extract.
// Y1 and Y2 are the positive and negative frequency limits of the notch filter on Y.
// Y3 is the center of the frequency response of the Y filter.
// I is the center of the frequency response of the I filter.
// Q is the center of the frequency response of the Q filter.
float Fc_y1 = NotchLowerFrequency * TimePerSample;
float Fc_y2 = NotchUpperFrequency * TimePerSample;
float Fc_y3 = YFrequency * TimePerSample;
float Fc_i = IFrequency * TimePerSample;
float Fc_q = QFrequency * TimePerSample;
float Pi2Fc_y1 = Fc_y1 * Pi2;
float Pi2Fc_y2 = Fc_y2 * Pi2;
float Pi2Fc_y3 = Fc_y3 * Pi2;
float Pi2Fc_i = Fc_i * Pi2;
float Pi2Fc_q = Fc_q * Pi2;
float Fc_y1_2 = Fc_y1 * 2.0;
float Fc_y2_2 = Fc_y2 * 2.0;
float Fc_y3_2 = Fc_y3 * 2.0;
float Fc_i_2 = Fc_i * 2.0;
float Fc_q_2 = Fc_q * 2.0;
vec4 CoordY = vec4(UV.y);
// 83 composite samples wide, 4 composite pixels per texel
for(float n = -31.0; n < 32.0; n += 4.0)
{
vec4 n4 = n + NotchOffset;
vec4 CoordX = UV.x + InverseRes.x * n4 * 0.25;
vec2 TexCoord = vec2(CoordX.x, CoordY.x);
vec4 C = CompositeSample(TexCoord, InverseRes) * CRange + MinC;
vec4 WT = W * (CoordX + A2 * CoordY * sourceSize[0].y + B);
vec4 Cosine = 0.54 + 0.46 * cos(Pi2Length * n4);
vec4 SincYIn1 = Pi2Fc_y1 * n4;
vec4 SincYIn2 = Pi2Fc_y2 * n4;
vec4 SincYIn3 = Pi2Fc_y3 * n4;
vec4 SincY1 = sin(SincYIn1) / SincYIn1;
vec4 SincY2 = sin(SincYIn2) / SincYIn2;
vec4 SincY3 = sin(SincYIn3) / SincYIn3;
// These zero-checks could be made more efficient if WebGL supported mix(vec4, vec4, bvec4)
// Unfortunately, the universe hates us
if(SincYIn1.x == 0.0) SincY1.x = 1.0;
if(SincYIn1.y == 0.0) SincY1.y = 1.0;
if(SincYIn1.z == 0.0) SincY1.z = 1.0;
if(SincYIn1.w == 0.0) SincY1.w = 1.0;
if(SincYIn2.x == 0.0) SincY2.x = 1.0;
if(SincYIn2.y == 0.0) SincY2.y = 1.0;
if(SincYIn2.z == 0.0) SincY2.z = 1.0;
if(SincYIn2.w == 0.0) SincY2.w = 1.0;
if(SincYIn3.x == 0.0) SincY3.x = 1.0;
if(SincYIn3.y == 0.0) SincY3.y = 1.0;
if(SincYIn3.z == 0.0) SincY3.z = 1.0;
if(SincYIn3.w == 0.0) SincY3.w = 1.0;
vec4 IdealY = (Fc_y1_2 * SincY1 - Fc_y2_2 * SincY2) + Fc_y3_2 * SincY3;
vec4 FilterY = Cosine * IdealY;
vec4 SincIIn = Pi2Fc_i * n4;
vec4 SincI = sin(SincIIn) / SincIIn;
if (SincIIn.x == 0.0) SincI.x = 1.0;
if (SincIIn.y == 0.0) SincI.y = 1.0;
if (SincIIn.z == 0.0) SincI.z = 1.0;
if (SincIIn.w == 0.0) SincI.w = 1.0;
vec4 IdealI = Fc_i_2 * SincI;
vec4 FilterI = Cosine * IdealI;
vec4 SincQIn = Pi2Fc_q * n4;
vec4 SincQ = sin(SincQIn) / SincQIn;
if (SincQIn.x == 0.0) SincQ.x = 1.0;
if (SincQIn.y == 0.0) SincQ.y = 1.0;
if (SincQIn.z == 0.0) SincQ.z = 1.0;
if (SincQIn.w == 0.0) SincQ.w = 1.0;
vec4 IdealQ = Fc_q_2 * SincQ;
vec4 FilterQ = Cosine * IdealQ;
YAccum += C * FilterY;
IAccum += C * cos(WT) * FilterI;
QAccum += C * sin(WT) * FilterQ;
}
float Y = dot(YAccum, One);
float I = dot(IAccum, One) * 2.0;
float Q = dot(QAccum, One) * 2.0;
vec3 YIQ = vec3(Y, I, Q);
vec3 OutRGB = vec3(dot(YIQ, YIQ2R), dot(YIQ, YIQ2G), dot(YIQ, YIQ2B));
return vec4(OutRGB, 1.0);
}
void main() {
FragColor = vec4(NTSCCodec(vTexCoord, sourceSize[0].zw));
}

View file

@ -1,13 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,208 +0,0 @@
#version 150
// This is a port of the NTSC encode/decode shader pair in MAME and MESS, modified to use only
// one pass rather than an encode pass and a decode pass. It accurately emulates the sort of
// signal decimation one would see when viewing a composite signal, though it could benefit from a
// pre-pass to re-size the input content to more accurately reflect the actual size that would
// be incoming from a composite signal source.
//
// To encode the composite signal, I convert the RGB value to YIQ, then subsequently evaluate
// the standard NTSC composite equation. Four composite samples per RGB pixel are generated from
// the incoming linearly-interpolated texels.
//
// The decode pass implements a Fixed Impulse Response (FIR) filter designed by MAME/MESS contributor
// "austere" in matlab (if memory serves correctly) to mimic the behavior of a standard television set
// as closely as possible. The filter window is 83 composite samples wide, and there is an additional
// notch filter pass on the luminance (Y) values in order to strip the color signal from the luminance
// signal prior to processing.
//
// Yes, this code could greatly use some cleaning up.
// ported from UltraMoogleMan's "Full MAME/MESS Shader Pipe" shadertoy: https://www.shadertoy.com/view/ldf3Rf
// license: presumably MAME's license at the time, which was noncommercial
#define scanlines 0.0
#define scandark 0.175
#define deconverge 0.0
#define pincushion 0.0
#define hertzroll 0.0
// Useful Constants
const vec4 Zero = vec4(0.0);
const vec4 Half = vec4(0.5);
const vec4 One = vec4(1.0);
const vec4 Two = vec4(2.0);
const vec3 Gray = vec3(0.3, 0.59, 0.11);
const float Pi = 3.1415926535;
const float Pi2 = 6.283185307;
// NTSC Constants
const vec4 A = vec4(0.5);
const vec4 A2 = vec4(1.0);
const vec4 B = vec4(0.5);
const float P = 1.0;
const float CCFrequency = 3.59754545;
const float NotchUpperFrequency = 5.59754545; //3.59754545 + 2.0;
const float NotchLowerFrequency = 1.59754545; //3.59754545 - 2.0;
const float YFrequency = 6.0;
const float IFrequency = 1.2;
const float QFrequency = 0.6;
const float NotchHalfWidth = 2.0;
const float ScanTime = 52.6;
const float Pi2ScanTime = 330.4955471482;// 6.283185307 * 52.6;
const float MaxC = 2.1183;
const vec4 YTransform = vec4(0.299, 0.587, 0.114, 0.0);
const vec4 ITransform = vec4(0.595716, -0.274453, -0.321263, 0.0);
const vec4 QTransform = vec4(0.211456, -0.522591, 0.311135, 0.0);
const vec3 YIQ2R = vec3(1.0, 0.956, 0.621);
const vec3 YIQ2G = vec3(1.0, -0.272, -0.647);
const vec3 YIQ2B = vec3(1.0, -1.106, 1.703);
const vec4 MinC = vec4(-1.1183);
const vec4 CRange = vec4(3.2366);
const vec4 InvCRange = vec4(1.0/3.2366);
const float Pi2Length = Pi2 / 63.0;
const vec4 NotchOffset = vec4(0.0, 1.0, 2.0, 3.0);
vec4 W = vec4(Pi2 * CCFrequency * ScanTime);
// Color Convolution Constants
const vec3 RedMatrix = vec3(1.0, 0.0, 0.0);
const vec3 GrnMatrix = vec3(0.0, 1.0, 0.0);
const vec3 BluMatrix = vec3(0.0, 0.0, 1.0);
const vec3 DCOffset = vec3(0.0, 0.0, 0.0);
const vec3 ColorScale = vec3(0.95, 0.95, 0.95);
const float Saturation = 1.4;
// Deconverge Constants
const vec3 ConvergeX = vec3(-0.4, 0.0, 0.2);
const vec3 ConvergeY = vec3( 0.0, -0.4, 0.2);
const vec3 RadialConvergeX = vec3(1.0, 1.0, 1.0);
const vec3 RadialConvergeY = vec3(1.0, 1.0, 1.0);
// Scanline/Pincushion Constants
const float PincushionAmount = 0.015;
const float CurvatureAmount = 0.015;
//const float ScanlineAmount = 0.175; <- move to parameter
const float ScanlineScale = 1.0;
const float ScanlineHeight = 1.0;
const float ScanlineBrightScale = 1.0;
const float ScanlineBrightOffset = 0.0;
const float ScanlineOffset = 0.0;
const vec3 Floor = vec3(0.05, 0.05, 0.05);
// 60Hz Bar Constants
const float SixtyHertzRate = (60.0 / 59.97 - 1.0); // Difference between NTSC and line frequency
const float SixtyHertzScale = 0.1;
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
uniform int phase;
in Vertex {
vec2 vTexCoord;
};
out vec4 FragColor;
vec4 ColorConvolution(vec2 UV, vec2 InverseRes)
{
vec3 InPixel = texture(source[0], UV).rgb;
// Color Matrix
float RedValue = dot(InPixel, RedMatrix);
float GrnValue = dot(InPixel, GrnMatrix);
float BluValue = dot(InPixel, BluMatrix);
vec3 OutColor = vec3(RedValue, GrnValue, BluValue);
// DC Offset & Scale
OutColor = (OutColor * ColorScale) + DCOffset;
// Saturation
float Luma = dot(OutColor, Gray);
vec3 Chroma = OutColor - Luma;
OutColor = (Chroma * Saturation) + Luma;
return vec4(OutColor, 1.0);
}
vec4 Deconverge(vec2 UV)
{
vec2 InverseRes = 1.0 / sourceSize[0].xy;
vec2 InverseSrcRes = 1.0 / sourceSize[0].xy;
vec3 CoordX = UV.x * RadialConvergeX;
vec3 CoordY = UV.y * RadialConvergeY;
CoordX += ConvergeX * InverseRes.x - (RadialConvergeX - 1.0) * 0.5;
CoordY += ConvergeY * InverseRes.y - (RadialConvergeY - 1.0) * 0.5;
float RedValue = ColorConvolution(vec2(CoordX.x, CoordY.x), InverseSrcRes).r;
float GrnValue = ColorConvolution(vec2(CoordX.y, CoordY.y), InverseSrcRes).g;
float BluValue = ColorConvolution(vec2(CoordX.z, CoordY.z), InverseSrcRes).b;
if (deconverge > 0.5) return vec4(RedValue, GrnValue, BluValue, 1.0);
else return vec4(texture(source[0], UV));
}
vec4 ScanlinePincushion(vec2 UV)
{
vec4 InTexel = Deconverge(UV);
vec2 PinUnitCoord = UV * Two.xy - One.xy;
float PincushionR2 = pow(length(PinUnitCoord), 2.0);
vec2 PincushionCurve = PinUnitCoord * PincushionAmount * PincushionR2;
vec2 BaseCoord = UV;
vec2 ScanCoord = UV;
BaseCoord *= One.xy - PincushionAmount * 0.2; // Warning: Magic constant
BaseCoord += PincushionAmount * 0.1;
BaseCoord += PincushionCurve;
ScanCoord *= One.xy - PincushionAmount * 0.2; // Warning: Magic constant
ScanCoord += PincushionAmount * 0.1;
ScanCoord += PincushionCurve;
vec2 CurveClipUnitCoord = UV * Two.xy - One.xy;
float CurvatureClipR2 = pow(length(CurveClipUnitCoord), 2.0);
vec2 CurvatureClipCurve = CurveClipUnitCoord * CurvatureAmount * CurvatureClipR2;
vec2 ScreenClipCoord = UV;
ScreenClipCoord -= Half.xy;
ScreenClipCoord *= One.xy - CurvatureAmount * 0.2; // Warning: Magic constant
ScreenClipCoord += Half.xy;
ScreenClipCoord += CurvatureClipCurve;
if (pincushion > 0.5){
// -- Alpha Clipping --
if (BaseCoord.x < 0.0) return vec4(0.0, 0.0, 0.0, 1.0);
if (BaseCoord.y < 0.0) return vec4(0.0, 0.0, 0.0, 1.0);
if (BaseCoord.x > 1.0) return vec4(0.0, 0.0, 0.0, 1.0);
if (BaseCoord.y > 1.0) return vec4(0.0, 0.0, 0.0, 1.0);
}
// -- Scanline Simulation --
float InnerSine = ScanCoord.y * sourceSize[0].y * ScanlineScale;
float ScanBrightMod = sin(InnerSine * Pi + ScanlineOffset * sourceSize[0].y);
float ScanBrightness = mix(1.0, (pow(ScanBrightMod * ScanBrightMod, ScanlineHeight) * ScanlineBrightScale + 1.0) * 0.5, scandark);
vec3 ScanlineTexel = InTexel.rgb * ScanBrightness;
// -- Color Compression (increasing the floor of the signal without affecting the ceiling) --
ScanlineTexel = Floor + (One.xyz - Floor) * ScanlineTexel;
if (scanlines > 0.5) return vec4(ScanlineTexel, 1.0);
else return vec4(InTexel);
}
vec4 SixtyHertz(vec2 UV)
{
vec4 InPixel = ScanlinePincushion(UV);
float Milliseconds = float(phase) * 15.0;
float TimeStep = fract(Milliseconds * SixtyHertzRate);
float BarPosition = 1.0 - fract(-UV.y + TimeStep) * SixtyHertzScale;
vec4 OutPixel = InPixel * BarPosition;
if (hertzroll > 0.5) return OutPixel;
else return InPixel;
}
void main() {
vec4 OutPixel = SixtyHertz(vTexCoord.xy);
FragColor = OutPixel;
}

View file

@ -1,16 +0,0 @@
#version 150
in vec4 position;
in vec2 texCoord;
out Vertex {
vec2 vTexCoord;
};
uniform vec4 targetSize;
uniform vec4 sourceSize[];
void main() {
gl_Position = position;
vTexCoord = texCoord;
}

View file

@ -1,20 +0,0 @@
input
filter: linear
program
filter: linear
height: 100%
width: 100%
vertex: mame-ntsc.vs
fragment: mame-ntsc.fs
program
filter: linear
modulo: 270.0
vertex: mame-postproc.vs
fragment: mame-postproc.fs
output
height: 0
width: 0
filter: linear

View file

@ -1,48 +0,0 @@
// Gaussian Scanlines
//
// adapted from NTSC Shader - written by Hans-Kristian Arntzen
// License: GPLv3
// pulled from git://github.com/libretro/common-shaders.git on 08/05/2013
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
uniform int phase;
#define DISPLAY_GAMMA 2.1
#define CRT_GAMMA 2.5
#define one (sourceSize[0]) //this is set to 1.0 / sourceSize[0] in the original version, but I think this looks better
#define pix_no texCoord.y * sourceSize[0]
#define TEX(off) pow(texture(source[0], texCoord - vec2(0.0, (off) * one.y)).rgb, vec3(CRT_GAMMA))
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
void main() {
vec3 frame0 = TEX(-2.0);
vec3 frame1 = TEX(-1.0);
vec3 frame2 = TEX(0.0);
vec3 frame3 = TEX(1.0);
vec3 frame4 = TEX(2.0);
float offset_dist = fract(pix_no.y) - 0.5;
float dist0 = 2.0 + offset_dist;
float dist1 = 1.0 + offset_dist;
float dist2 = 0.0 + offset_dist;
float dist3 = -1.0 + offset_dist;
float dist4 = -2.0 + offset_dist;
vec3 scanline = frame0 * exp(-5.0 * dist0 * dist0);
scanline += frame1 * exp(-5.0 * dist1 * dist1);
scanline += frame2 * exp(-5.0 * dist2 * dist2);
scanline += frame3 * exp(-5.0 * dist3 * dist3);
scanline += frame4 * exp(-5.0 * dist4 * dist4);
fragColor = vec4(pow(1.15 * scanline, vec3(1.0 / DISPLAY_GAMMA)), 1.0);
}

View file

@ -1,26 +0,0 @@
input
filter: nearest
format: rgba16f
program
filter: nearest
format: rgba16f
width: 400%
height: 100%
modulo: 2
fragment: ntsc-pass1.fs
program
filter: nearest
format: rgba16f
width: 50%
height: 100%
fragment: ntsc-pass2.fs
program
filter: linear
width: 100%
height: 100%
output
filter: nearest

View file

@ -1,103 +0,0 @@
// NTSC Shader - written by Hans-Kristian Arntzen
// License: GPLv3
// pulled from git://github.com/libretro/common-shaders.git on 01/30/2014
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
uniform int phase;
// uniforms added for compatibility
out vec3 col;
out float mod_phase;
out float chroma_phase;
#define THREE_PHASE
#define COMPOSITE
// #include "ntsc-param.inc" //
#define PI 3.14159265
#if defined(TWO_PHASE)
#define CHROMA_MOD_FREQ (4.0 * PI / 15.0)
#elif defined(THREE_PHASE)
#define CHROMA_MOD_FREQ (PI / 3.0)
#endif
#if defined(COMPOSITE)
#define SATURATION 1.0
#define BRIGHTNESS 1.0
#define ARTIFACTING 1.0
#define FRINGING 1.0
#elif defined(SVIDEO)
#define SATURATION 1.0
#define BRIGHTNESS 1.0
#define ARTIFACTING 0.0
#define FRINGING 0.0
#endif
#if defined(COMPOSITE) || defined(SVIDEO)
mat3 mix_mat = mat3(
BRIGHTNESS, FRINGING, FRINGING,
ARTIFACTING, 2.0 * SATURATION, 0.0,
ARTIFACTING, 0.0, 2.0 * SATURATION
);
#endif
// END "ntsc-param.inc" //
// moved from vertex
#define pix_no (texCoord.xy * sourceSize[0].xy * (targetSize.xy / sourceSize[0].xy))
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
mat3 yiq2rgb_mat = mat3(
1.0, 1.0, 1.0,
0.956, -0.2720, -1.1060,
0.6210, -0.6474, 1.7046
);
vec3 yiq2rgb(vec3 yiq)
{
return (yiq * yiq2rgb_mat);
}
mat3 yiq_mat = mat3(
0.2989, 0.5959, 0.2115,
0.5870, -0.2744, -0.5229,
0.1140, -0.3216, 0.3114
);
vec3 rgb2yiq(vec3 col)
{
return (col * yiq_mat);
}
void main() {
// #include "ntsc-pass1-encode-demodulate.inc" //
vec3 col = texture(source[0], texCoord).rgb;
vec3 yiq = rgb2yiq(col);
#if defined(TWO_PHASE)
float chroma_phase = PI * (mod(pix_no.y, 2.0) + phase);
#elif defined(THREE_PHASE)
float chroma_phase = 0.6667 * PI * (mod(pix_no.y, 3.0) + phase);
#endif
float mod_phase = chroma_phase + pix_no.x * CHROMA_MOD_FREQ;
float i_mod = cos(mod_phase);
float q_mod = sin(mod_phase);
yiq.yz *= vec2(i_mod, q_mod); // Modulate
yiq *= mix_mat; // Cross-talk
yiq.yz *= vec2(i_mod, q_mod); // Demodulate
fragColor = vec4(yiq, 1.0);
// END "ntsc-pass1-encode-demodulate.inc" //
}

View file

@ -1,252 +0,0 @@
// NTSC Shader - written by Hans-Kristian Arntzen
// License: GPLv3
// pulled from git://github.com/libretro/common-shaders.git on 01/30/2014
#version 150
uniform sampler2D source[];
uniform vec4 sourceSize[];
uniform vec4 targetSize;
#define THREE_PHASE //options here include THREE_PHASE, TWO_PHASE or OLD_THREE_PHASE
#define GAMMA_CORRECTION //comment to disable gamma correction, usually because higan's gamma correction is enabled or you have another shader already doing it
#define CRT_GAMMA 2.5
#define DISPLAY_GAMMA 2.1
#if defined OLD_THREE_PHASE
#define TAPS 24
const float luma_filter[TAPS + 1] = float[TAPS + 1](
-0.000071070,
-0.000032816,
0.000128784,
0.000134711,
-0.000226705,
-0.000777988,
-0.000997809,
-0.000522802,
0.000344691,
0.000768930,
0.000275591,
-0.000373434,
0.000522796,
0.003813817,
0.007502825,
0.006786001,
-0.002636726,
-0.019461182,
-0.033792479,
-0.029921972,
0.005032552,
0.071226466,
0.151755921,
0.218166470,
0.243902439);
const float chroma_filter[TAPS + 1] = float[TAPS + 1](
0.001845562,
0.002381606,
0.003040177,
0.003838976,
0.004795341,
0.005925312,
0.007242534,
0.008757043,
0.010473987,
0.012392365,
0.014503872,
0.016791957,
0.019231195,
0.021787070,
0.024416251,
0.027067414,
0.029682613,
0.032199202,
0.034552198,
0.036677005,
0.038512317,
0.040003044,
0.041103048,
0.041777517,
0.042004791);
#endif
#if defined(THREE_PHASE)
// #include "ntsc-decode-filter-3phase.inc" //
#define TAPS 24
const float luma_filter[TAPS + 1] = float[TAPS + 1](
-0.000012020,
-0.000022146,
-0.000013155,
-0.000012020,
-0.000049979,
-0.000113940,
-0.000122150,
-0.000005612,
0.000170516,
0.000237199,
0.000169640,
0.000285688,
0.000984574,
0.002018683,
0.002002275,
-0.000909882,
-0.007049081,
-0.013222860,
-0.012606931,
0.002460860,
0.035868225,
0.084016453,
0.135563500,
0.175261268,
0.190176552);
const float chroma_filter[TAPS + 1] = float[TAPS + 1](
-0.000118847,
-0.000271306,
-0.000502642,
-0.000930833,
-0.001451013,
-0.002064744,
-0.002700432,
-0.003241276,
-0.003524948,
-0.003350284,
-0.002491729,
-0.000721149,
0.002164659,
0.006313635,
0.011789103,
0.018545660,
0.026414396,
0.035100710,
0.044196567,
0.053207202,
0.061590275,
0.068803602,
0.074356193,
0.077856564,
0.079052396);
// END "ntsc-decode-filter-3phase.inc" //
#elif defined(TWO_PHASE)
// #include "ntsc-decode-filter-3phase.inc" //
#define TAPS 24
const float luma_filter[TAPS + 1] = float[TAPS + 1](
-0.000012020,
-0.000022146,
-0.000013155,
-0.000012020,
-0.000049979,
-0.000113940,
-0.000122150,
-0.000005612,
0.000170516,
0.000237199,
0.000169640,
0.000285688,
0.000984574,
0.002018683,
0.002002275,
-0.000909882,
-0.007049081,
-0.013222860,
-0.012606931,
0.002460860,
0.035868225,
0.084016453,
0.135563500,
0.175261268,
0.190176552);
const float chroma_filter[TAPS + 1] = float[TAPS + 1](
-0.000118847,
-0.000271306,
-0.000502642,
-0.000930833,
-0.001451013,
-0.002064744,
-0.002700432,
-0.003241276,
-0.003524948,
-0.003350284,
-0.002491729,
-0.000721149,
0.002164659,
0.006313635,
0.011789103,
0.018545660,
0.026414396,
0.035100710,
0.044196567,
0.053207202,
0.061590275,
0.068803602,
0.074356193,
0.077856564,
0.079052396);
// END "ntsc-decode-filter-3phase.inc" //
#endif
// #include ntsc-rgbyuv.inc //
mat3 yiq2rgb_mat = mat3(
1.0, 1.0, 1.0,
0.956, -0.2720, -1.1060,
0.6210, -0.6474, 1.7046
);
vec3 yiq2rgb(vec3 yiq)
{
return (yiq * yiq2rgb_mat);
}
mat3 yiq_mat = mat3(
0.2989, 0.5959, 0.2115,
0.5870, -0.2744, -0.5229,
0.1140, -0.3216, 0.3114
);
vec3 rgb2yiq(vec3 col)
{
return (col * yiq_mat);
}
// END ntsc-rgbyuv.inc //
// fixCoord moved from vertex
#define fixCoord (texCoord - vec2(0.5 / sourceSize[0].x, 0.0)) // Compensate for decimate-by-2.
#define fetch_offset(offset, one_x) \
texture(source[0], fixCoord + vec2((offset) * (one_x), 0.0)).xyz
in Vertex {
vec2 texCoord;
};
out vec4 fragColor;
void main() {
// #include "ntsc-pass2-decode.inc" //
float one_x = 1.0 / sourceSize[0].x;
vec3 signal = vec3(0.0);
for (int i = 0; i < TAPS; i++)
{
float offset = float(i);
vec3 sums = fetch_offset(offset - float(TAPS), one_x) +
fetch_offset(float(TAPS) - offset, one_x);
signal += sums * vec3(luma_filter[i], chroma_filter[i], chroma_filter[i]);
}
signal += texture(source[0], fixCoord).xyz * vec3(luma_filter[TAPS], chroma_filter[TAPS], chroma_filter[TAPS]);
// END "ntsc-pass2-decode.inc" //
vec3 rgb = yiq2rgb(signal);
#ifdef GAMMA_CORRECTION
vec3 gamma = vec3(CRT_GAMMA / DISPLAY_GAMMA);
rgb = pow(rgb, gamma.rgb);
#endif
fragColor = vec4(rgb, 1.0);
}

View file

@ -1,11 +0,0 @@
input
filter: nearest
program
filter: nearest
height: 100%
fragment: pal-r57shell.fs
output
height: 0
filter: linear

Some files were not shown because too many files have changed in this diff Show more