Ilya3point999K / ThaumicConcilium

Thaumcraft 4 Addon
Creative Commons Zero v1.0 Universal
8 stars 5 forks source link

(Возможно неисправимо) Визуальный баг при использовании с шейдерами (карта теней) #6

Closed Darek505 closed 2 months ago

Darek505 commented 2 months ago

Здравствуйте, скажу сразу: я совершенно не против если вы откажитесь что-либо с этим делать, так как шейдеры всегда были крайне нестабильны по отношению к модам, с подобным рендером, хотя мне все равно хотелось бы узнать ваше мнение на этот счет, я никого не обязываю что-либо предпринимать

да, я знаю, optifine все ломает (как всегда) но :

1) один мой друг работает над вики по возможным ошибкам с шейдерами, было бы неплохо узнать детали насчет этой ошибки (конечно, если вы их знаете), так как ошибка подобного типа также встречается в моде "Avaritia" (и возможно не только там), и имеет идентичный характер.

2) в разработке находится мод "Angelica", который должен стать open-source заменой optifine на базе sodium/iris, поэтому я думаю что (возможно) стоит изучить эту проблему как можно раньше? (хотя, возможно все же стоит дождаться релиза или хотя бы бета теста с шейдерами?)

Сама ошибка: ![2024-07-06_20 08 34](https://github.com/Ilya3point999K/ThaumicConcilium/assets/122032896/c7904306-2c86-400c-b11f-09892a8d337b) ![2024-07-06_20 08 39](https://github.com/Ilya3point999K/ThaumicConcilium/assets/122032896/eea0b2c1-66d1-47c3-9f08-f6c26a6891c2) Видно, что при взятии в руки Astral Monitor, карта теней для сущностей сильно искажается ![2024-07-06_20 23 36](https://github.com/Ilya3point999K/ThaumicConcilium/assets/122032896/f17b635b-69a7-49cb-aa28-1a3cccdfe25a) тоже самое происходит и с Flux Rift, хотя он искажает карту теней не полностью, а у определенных (некоторых) сущностей?
Ilya3point999K commented 2 months ago

Лично я бы поставил на то, что дело в ванильных методах передергивающих лайтмапы, по типу OpenGlHelper.setLightmapTextureCoords. Что с этим делать - я, конечно, знаю - переписать кубы на нормальный движок, но такое решение вряд ли всех устроит.

GedeonGrays commented 2 months ago

@Darek505, здравствуйте. Могу предложить связаться с автором этого проекта: https://legacy.curseforge.com/minecraft/mc-mods/shader-fixer

Возможно, он согласится исправить данную проблему с шейдерами или хотя бы подскажет простое решение, которое можно будет интегрировать в ThaumicConcilium ¯_(ツ)_/¯

Darek505 commented 2 months ago

GedeonGrays: Могу предложить связаться с автором этого проекта:

Это, кстати, и есть мой друг который работает над вики, сегодня ему написал,

Ilya3point999K: Лично я бы поставил на то, что дело в ванильных методах передергивающих лайтмапы, по типу OpenGlHelper.setLightmapTextureCoords

как он сказал, проблема не связанна с ванильными методами которые связаны с освещением. Когда он пытался исправить похожую проблему в Avaritia, проблема была связанна именно с шейдерами в моде. Единственным модом, в котором были собственные шейдеры и они "частично" работали с шейдерами optifine, был Psychedelicraft, однако работают только 2d шейдеры, и устроены они довольно сложно.

GedeonGrays: хотя бы подскажет простое решение, которое можно будет интегрировать в ThaumicConcilium

Он предложил "невероятно костыльное """решение""" проблемы", цитирую:

Kotmatross: это явно нельзя назвать решением, однако сделать так чтобы тени не ломались, ценой эффектов (с шейдерами конечно, без них все останется также) можно, вызывать ShaderHelper.useShader/ShaderHelper.releaseShader, если не обнаруживается активных шейдеров (то есть без шейдеров, эти методы вызываться будут, но как только кто-то включает шейдеры, то не будут) это, конечно, сделает вещи которые используют шейдеры статичной текстурой (endShader/endScreenShader), но по крайней мере они ничего не будут ломать, код обнаружения шейдеров :

```java private static final boolean is_shaders_mod_loaded; static { boolean shadersMod = false; try { shadersMod = Launch.classLoader.getClassBytes("shadersmod.client.Shaders") != null; } catch (IOException ign) {} is_shaders_mod_loaded = shadersMod ; } public static boolean shaderPackLoaded() { return Shaders.shaderPackLoaded; } public static boolean shadersEnabled() { return is_shaders_mod_loaded && shaderPackLoaded(); } ```

Kotmatross: далее нужно каждый вызов ShaderHelper.useShader/ShaderHelper.releaseShader оборачивать в:

if(!shadersEnabled()) {
    ShaderHelper...
}

Kotmatross: где нужно ставить (класс, строки):

1) DistortionEffectRenderer - 38, 43 2) MaterialPeelerRenderer - 39, 62 3) RiftRenderer - 45, 98 (хотя я думаю что можно оставить, типа как фича разлома?) 4) HexOfPredictabilityTileRenderer - 54, 89 5) DissolvedRenderer - 46, 72 6) QuicksilverElementalRenderer - 41, 43 7) CrimsonOrbEntityRenderer - 39, 44 8) AstralMonitorRenderer - 175, 206, 213, 217

kotmatross28729 commented 2 months ago

Небольшая поправка: если "оборачивать", то помимо ShaderHelper.useShader/ShaderHelper.releaseShader, нужно также и ARBShaderObjects.glUniform1iARB, иначе 1282 (Invalid operation)

kotmatross28729 commented 1 week ago

Мне удалось это исправить (практически) в shader-fixer

Кратко: говорим шейдерам что они могут делать все что хотят, но только после нас Детально: Исправление заключается в том, что перед useShader мы сохраняем текущий shader program а после releaseShader используем его (тем самым избегаем конфликт из-за использования в одно время)

Вот до: https://github.com/user-attachments/assets/411b08a0-db2f-40a6-a3d9-e20f270dbd45
А вот после: https://github.com/user-attachments/assets/acf34bcf-bfee-40bc-960f-00efde0fc974
Конечно, не без проблем: https://github.com/user-attachments/assets/4ea433d3-0ce9-45da-9ee6-dd7299ffeb7f

Тут видно, что этот баг остался на предметах/сущностях, которые используют шейдеры для рендера (то же самое с Rift/Dissolved и т.п)

Однако, такой проблемы не наблюдается, например в avaritia после исправления: https://github.com/user-attachments/assets/eecec50f-94fb-49b4-8b29-9bfd5b25f412

Покопавшись в коде, я пришел к выводу, что это происходит из-за того, что в ThaumicConcilium униформы для ShaderCallback добавляются в каждом классе рендера, а в avaritia непосредственно в самом ShaderHelper

В текущем состоянии исправить 2 (с помощью миксинов) невозможно, так как ThaumicConcilium реализует униформы в конструкторе, а туда inject делать нельзя.

Поэтому, @Ilya3point999K, вопрос: можно ли сделать PR с более правильным исправлением непосредственно в ThaumicConcilium? (Исправление никак не влияет на ванильный рендер (без шейдеров) /производительность и т.п)

Darek505 commented 1 week ago

Нифига не понятно, но спасибо