Closed Darek505 closed 4 months ago
Лично я бы поставил на то, что дело в ванильных методах передергивающих лайтмапы, по типу OpenGlHelper.setLightmapTextureCoords. Что с этим делать - я, конечно, знаю - переписать кубы на нормальный движок, но такое решение вряд ли всех устроит.
@Darek505, здравствуйте. Могу предложить связаться с автором этого проекта: https://legacy.curseforge.com/minecraft/mc-mods/shader-fixer
Возможно, он согласится исправить данную проблему с шейдерами или хотя бы подскажет простое решение, которое можно будет интегрировать в ThaumicConcilium ¯_(ツ)_/¯
GedeonGrays: Могу предложить связаться с автором этого проекта:
Это, кстати, и есть мой друг который работает над вики, сегодня ему написал,
Ilya3point999K: Лично я бы поставил на то, что дело в ванильных методах передергивающих лайтмапы, по типу OpenGlHelper.setLightmapTextureCoords
как он сказал, проблема не связанна с ванильными методами которые связаны с освещением. Когда он пытался исправить похожую проблему в Avaritia, проблема была связанна именно с шейдерами в моде. Единственным модом, в котором были собственные шейдеры и они "частично" работали с шейдерами optifine, был Psychedelicraft, однако работают только 2d шейдеры, и устроены они довольно сложно.
GedeonGrays: хотя бы подскажет простое решение, которое можно будет интегрировать в ThaumicConcilium
Он предложил "невероятно костыльное """решение""" проблемы", цитирую:
Kotmatross: это явно нельзя назвать решением, однако сделать так чтобы тени не ломались, ценой эффектов (с шейдерами конечно, без них все останется также) можно, вызывать
ShaderHelper.useShader
/ShaderHelper.releaseShader
, если не обнаруживается активных шейдеров (то есть без шейдеров, эти методы вызываться будут, но как только кто-то включает шейдеры, то не будут) это, конечно, сделает вещи которые используют шейдеры статичной текстурой (endShader
/endScreenShader
), но по крайней мере они ничего не будут ломать, код обнаружения шейдеров :
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
Небольшая поправка: если "оборачивать", то помимо ShaderHelper.useShader
/ShaderHelper.releaseShader
, нужно также и ARBShaderObjects.glUniform1iARB
, иначе 1282 (Invalid operation)
Мне удалось это исправить (практически) в shader-fixer
Кратко: говорим шейдерам что они могут делать все что хотят, но только после нас Детально: Исправление заключается в том, что перед useShader мы сохраняем текущий shader program а после releaseShader используем его (тем самым избегаем конфликт из-за использования в одно время)
Тут видно, что этот баг остался на предметах/сущностях, которые используют шейдеры для рендера (то же самое с Rift/Dissolved и т.п)
Покопавшись в коде, я пришел к выводу, что это происходит из-за того, что в ThaumicConcilium униформы для ShaderCallback добавляются в каждом классе рендера, а в avaritia непосредственно в самом ShaderHelper
В текущем состоянии исправить 2 (с помощью миксинов) невозможно, так как ThaumicConcilium реализует униформы в конструкторе, а туда inject делать нельзя.
Поэтому, @Ilya3point999K, вопрос: можно ли сделать PR с более правильным исправлением непосредственно в ThaumicConcilium? (Исправление никак не влияет на ванильный рендер (без шейдеров) /производительность и т.п)
Нифига не понятно, но спасибо
Здравствуйте, скажу сразу: я совершенно не против если вы откажитесь что-либо с этим делать, так как шейдеры всегда были крайне нестабильны по отношению к модам, с подобным рендером, хотя мне все равно хотелось бы узнать ваше мнение на этот счет, я никого не обязываю что-либо предпринимать
да, я знаю, 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, хотя он искажает карту теней не полностью, а у определенных (некоторых) сущностей?