diff --git a/README.md b/README.md index 338923f..04a969c 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ La version **beta.138** adapte l’épaisseur des **rayons solaires à la mété plus denses et diffus dans le brouillard, renforcés sous les précipitations, avec moins de lumière pendant l’orage. Le curseur reste inchangé. Le [ticket](docs/shader-beta138.md) détaille le rendu et ses vérifications. +La [vérification Vulkan](docs/shader-vulkan-beta138.md) précise les backends testés +et les limites de la validation par pilote. Release publiée et même instance Prism synchronisée ; sauvegardes et réglages conservés. La [livraison précédente](docs/clay-workshop-integration-beta110.md) réunit déjà l’atelier, les œufs et la neige saisonnière dans l’instance **Sanctuary Beta**. diff --git a/docs/shader-vulkan-beta138.md b/docs/shader-vulkan-beta138.md new file mode 100644 index 0000000..113c1ac --- /dev/null +++ b/docs/shader-vulkan-beta138.md @@ -0,0 +1,99 @@ +# SHADER-139 — Compatibilité Vulkan du shader beta.138 + +Socle **beta.138**, Minecraft **26.3**, Java **25**, branche +`codex/vulkan-shaders-beta139`. + +Le signalement initial concernait un bloom invisible même à 100 %. Le joueur +indique ensuite que le rendu fonctionne de nouveau sur Windows et demande +la compatibilité Vulkan. Les changements expérimentaux d'intensité ont été +retirés : les shaders et les valeurs par défaut restent ceux de beta.138. + +## Contrat + +Utiliser les mêmes pipelines RenderPearl sur OpenGL et Vulkan. Vérifier le +backend réellement utilisé, car Minecraft peut retomber sur OpenGL lorsque +Vulkan ne démarre pas. Tester les effets dans de nouveaux mondes ignorés, +sans ouvrir de sauvegarde personnelle ni modifier le backend de l'instance Prism. + +Le lancement des tests accepte désormais `-PsanctuaryClientGraphicsBackend=vulkan` +ou `opengl`. Les tests de shaders refusent tout repli silencieux et consignent +le nom du backend, du GPU et du pilote. Cette option concerne uniquement +le client de développement. + +## Reproduction + +```sh +JAVA_HOME=/chemin/vers/jdk-25 ./gradlew :sanctuary:runClientGameTest \ + -PsanctuaryClientTests=true -PsanctuaryPixelShadows122ClientTests=true \ + -PsanctuaryClientGraphicsBackend=vulkan \ + -PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true +``` + +Sur Windows, utiliser `gradlew.bat` avec les mêmes propriétés et Java 25. +Ajouter `-PsanctuaryClientImprovedTransparency=true` pour tester la transparence +améliorée ; le choix initial est restauré après le test. +Pour les rayons et la météo, remplacer `sanctuaryPixelShadows122ClientTests` +par `sanctuarySunshaft137ClientTests`. Pour isoler le bloom et le lens flare, +utiliser `sanctuaryBloom130ClientTests`. + +## Diagnostic initial + +Le client Vulkan démarre ici sur **Apple M1 / MoltenVK 1.4.2**, API 1.2.350. +Le test du bloom réussit en **2 min 19 s** : les masques des vingt minerais, +les contrôles OFF/zéro, intensité/diffusion, l'occlusion, le rechargement, +les torches, glowstone, lampes, lave, soleil et le lens flare sont vérifiés. +Les mesures de référence du bloom sont identiques à celles d'OpenGL : +14649 pixels de minerai, gain du halo faible 218131, fort 1970502, +gain solaire 7708. Log : `build/shader139-vulkan-first.log`. + +Cela confirme cette combinaison précise ; ce n'est pas une validation des +pilotes NVIDIA/AMD/Intel sous Windows. En cas de retour du problème, le +`logs/latest.log` de la session Windows concernée est nécessaire pour relever +le backend effectif, le GPU, le pilote et les éventuelles erreurs de pipeline. + +## Suite Vulkan + +`sanctuaryPixelShadows122ClientTests` réussit en **8 min 50 s**. Les contrôles +couvrent ombres diurnes/nocturnes, feuillage, stabilité en temps réel, +highlights CTM, bloom et lens flare, SSGI en déplacement et près des surfaces, +PBR directionnel, rechargement, redimensionnement et interfaces FR/EN. +Log : `build/shader139-vulkan-suite2.log`. + +Le bloom et le lens flare réussissent aussi avec +`sanctuaryClientImprovedTransparency=true`, en **1 min 45 s**. Le backend +est bien Vulkan, sa profondeur est en `[0, 1]` et l'option de transparence +est active. Les mesures du bloom restent identiques. +Log : `build/shader139-vulkan-transparency.log`. + +La suite météo/rayons beta.138 n'a pas été rejouée sous Vulkan dans ce ticket ; +les résultats ci-dessus portent sur les effets explicitement listés. +Le joueur confirme que le retour à OpenGL rétablit l'effet sur Windows. +Ce défaut particulier reste à reproduire à partir d'un journal récent. + +Un premier lancement utilisait un nom de propriété incomplet et a exécuté +la suite générale, échouant dans Blocodex avant les tests de shaders. +Ce lancement n'est pas compté comme une validation Vulkan des shaders. +La commande corrigée utilise `sanctuaryPixelShadows122ClientTests`. + +## Construction + +`./gradlew check build -x :sanctuary:runGameTest` réussit ; le serveur +GameTest dédié reste exclu conformément au refus EULA antérieur. +Log : `build/shader139-check-build.log`. Le JAR reconstruit est **strictement +identique, octet pour octet**, au JAR Sanctuary de la release beta.138. +La distribution ne change pas et ne nécessite donc pas de nouvel assemblage. + +## Distribution + +Ce ticket ajoute des options de lancement de tests et leur documentation. +Les shaders de production et les réglages de beta.138 ne sont pas changés. +Aucune nouvelle livraison binaire, aucun tag beta.139 ni mise à jour de +l'instance personnelle n'est effectué pour une vérification seule. + +## Référence du moteur + +Minecraft 26.3 compile les shaders OpenGL et Vulkan via ShaderC et expose +`RENDERPEARL_DEPTH_IS_ZERO_TO_ONE` pour la convention de profondeur. +[Notes officielles Minecraft 26.3](https://feedback.minecraft.net/hc/en-us/articles/48913133328013-Minecraft-Java-Edition-26-3). +Les effets Sanctuary transmettent déjà la convention du périphérique aux +reconstructions de position ; aucun remplacement spéculatif n'est appliqué. diff --git a/mods/sanctuary/build.gradle b/mods/sanctuary/build.gradle index f2e2944..775a42f 100644 --- a/mods/sanctuary/build.gradle +++ b/mods/sanctuary/build.gradle @@ -25,6 +25,15 @@ if (clientRenderTests) { java.srcDir('src/clientGametest/java') } tasks.named('runClientGameTest') { + def graphicsBackend = providers.gradleProperty('sanctuaryClientGraphicsBackend') + if (graphicsBackend.isPresent()) { + args('--graphicsBackend', graphicsBackend.get()) + systemProperty('sanctuary.test.graphicsBackend', graphicsBackend.get()) + } + def improvedTransparency = providers.gradleProperty('sanctuaryClientImprovedTransparency') + if (improvedTransparency.isPresent()) { + systemProperty('sanctuary.test.improvedTransparency', improvedTransparency.get()) + } systemProperty('sanctuary.test.noVsync', providers.gradleProperty('sanctuaryClientNoVsync').getOrElse('false')) systemProperty('sanctuary.test.quick', providers.gradleProperty('sanctuaryQuickTests').getOrElse('false')) systemProperty('sanctuary.test.introVisualOnly', providers.gradleProperty('sanctuaryIntroVisualOnly').getOrElse('false')) diff --git a/mods/sanctuary/src/clientGametest/java/fr/koka/sanctuary/client/shader/PixelShadows122ClientChecks.java b/mods/sanctuary/src/clientGametest/java/fr/koka/sanctuary/client/shader/PixelShadows122ClientChecks.java index 77e6e82..9c2259a 100644 --- a/mods/sanctuary/src/clientGametest/java/fr/koka/sanctuary/client/shader/PixelShadows122ClientChecks.java +++ b/mods/sanctuary/src/clientGametest/java/fr/koka/sanctuary/client/shader/PixelShadows122ClientChecks.java @@ -51,6 +51,14 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest { @Override public void runTest(ClientGameTestContext c) { + c.runOnClient(m -> { + var info = com.mojang.blaze3d.systems.RenderSystem.getDevice().getDeviceInfo(); + String expected = System.getProperty("sanctuary.test.graphicsBackend", ""); + check(expected.isEmpty() || info.backendName().equalsIgnoreCase(expected), + "Requested graphics backend must not silently fall back: " + expected + " / " + info.backendName()); + System.out.println("SHADER139_BACKEND " + info.backendName() + " / " + info.name() + + " / " + info.driverInfo() + " / zeroToOne=" + info.isZZeroToOne()); + }); var path = FabricLoader.getInstance().getConfigDir().resolve("sanctuary-shaders.json"); final byte[] originalPreferences; try { @@ -82,6 +90,9 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest { m.options.bobView().set(false); m.options.pauseOnLostFocus = false; m.options.setCameraType(CameraType.FIRST_PERSON); + String transparency = System.getProperty("sanctuary.test.improvedTransparency"); + if (transparency != null) m.options.improvedTransparency().set(Boolean.parseBoolean(transparency)); + System.out.println("SHADER139_TRANSPARENCY " + m.options.improvedTransparency().get()); checkPreferences(); }); try (var world = c.worldBuilder().adjustSettings(s -> { @@ -653,11 +664,11 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest { } private record Options(int distance, int simulationDistance, int fov, boolean bob, - boolean pause, CameraType camera, String language) { + boolean pause, CameraType camera, String language, boolean improvedTransparency) { static Options capture(Minecraft m) { return new Options(m.options.renderDistance().get(), m.options.simulationDistance().get(), m.options.fov().get(), m.options.bobView().get(), m.options.pauseOnLostFocus, - m.options.getCameraType(), m.getLanguageManager().getSelected()); + m.options.getCameraType(), m.getLanguageManager().getSelected(), m.options.improvedTransparency().get()); } void restore(Minecraft m) { @@ -667,6 +678,7 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest { m.options.bobView().set(bob); m.options.pauseOnLostFocus = pause; m.options.setCameraType(camera); + m.options.improvedTransparency().set(improvedTransparency); m.getLanguageManager().setSelected(language); m.getLanguageManager().onResourceManagerReload(m.getResourceManager()); }