Рендер ведет себя неадекватно. BlockRenderLayer

Версия Minecraft
1.12.2
5,018
47
783
Здраствуйте. Уже много раз сталкивался с подобным говнецом. Короче есть такой метод getBlockLayer, который возвращает BlockRenderLayer
Там есть несколько видов - SOLID(совсем непрозрачный) CUTOUT(либо прозрачный полностью, либо нет) CUTOUT_MIPPED(вроде типо такого, только еще мип-текстурирование отключает, но это не точно) и TRANSLUCENT(это то что надо, имеет альфа канал, который позволяет брать прозрачность прямо из текстурки. Но с кусками модели(или сторонами, я так и не понял точно), которые становятся скрытыми за другими кусками, происходит вот такая дичь, которую вы видеть можете на скрине. Это порядком бесит и хер его знает как фиксится, поэтому обращаюсь к вам. Может знает как убрать это налезание?

Внедрившись через BlockRenderLayer в глубины ванильного кода я так и не смог отыскать где все таки происходит эта хренатень с обязательным рендером на экран всех сторон
2019-08-07_22.32.52.png
 
Последнее редактирование:
2,505
81
397
Дело в том, что ты всю модель рендеришь, как полупрозрачную.

Попробую объяснить, почему возникает эта проблема. Рассмотрим два квада: горизонтальный верхний белый квад и вертикальный ближний стеклянный. Полупрозрачные полигоны сортируются майном от дальнего к ближнему. Центр белого полигона дальше, чем центр стеклянного, поэтому стеклянный рендерится поверх (потому что для полупрозрачных объектов отключена запись в буфер глубины).

Для решения этой проблемы тебе нужно разделить свою модель на два слоя: непрозрачный и полупрозрачный.
 
7,099
324
1,509
2,505
81
397
@Dahaka, а можно ли как-то получить глубину полупрозрачных блоков? Хотя бы в отдельном Имедж Буфере.
Можно, если писать глубину.

По идее нужно включить
Артефакты все равно будут. А еще, в майне сортируются только полигоны полупрозрачного слоя мира (и еще в новых версиях после батчинга полигонов в полупрозрачном TESR пассе, но все равно отдельно от полигонов мира). Поэтому при записи в глубину, не увидишь, например, партиклы за блоком воды.
И разделить модель на два слоя в любом случае стоит.
 
1,990
18
105
Не хуком, а сделать две отдельные модели - одну, что рисуется полностью без полупрозрачности, и вторую, где только полупрозрачные части. Каждой из них назначить соответствующий render pass.
Более-менее адекватный рендер поддерживает такое на уровне материалов, чтоб не приходилось делать две модели. Например, такое легко делается отложенной отрисовкой (не путать с deferred rendering который про gbuffer и всё такое).
 
5,018
47
783
Ничего не понял, но очень интересно. Где то можно посмотреть подобные реализации?
суть в том, что есть CUTOUT - поддерживает прозрачность, но либо полную, либо нулевую. Может его как то усовершенствовать чтобы он и значения между 0 и 1 тоже воспринимал?
 
Последнее редактирование:
5,018
47
783
Нашел нечто в RenderChunk. Это оно?
Java:
    public void resortTransparency(float x, float y, float z, ChunkCompileTaskGenerator generator)
    {
        CompiledChunk compiledchunk = generator.getCompiledChunk();

        if (compiledchunk.getState() != null && !compiledchunk.isLayerEmpty(BlockRenderLayer.TRANSLUCENT))
        {
            this.preRenderBlocks(generator.getRegionRenderCacheBuilder().getWorldRendererByLayer(BlockRenderLayer.TRANSLUCENT), this.position);
            generator.getRegionRenderCacheBuilder().getWorldRendererByLayer(BlockRenderLayer.TRANSLUCENT).setVertexState(compiledchunk.getState());
            this.postRenderBlocks(BlockRenderLayer.TRANSLUCENT, x, y, z, generator.getRegionRenderCacheBuilder().getWorldRendererByLayer(BlockRenderLayer.TRANSLUCENT), compiledchunk);
        }
    }
 
5,018
47
783
Чекнул. Походу это для сущностей, типо там че то на сущностях рендерить
 
5,018
47
783
Апну тему, чтобы не создавать новую. На днях опять сделал модель с полупрозрачным стеклом и вспомнил об этой гадости. Большое спасибо @hohserg1 , он помог мне более точно сформулировать вопрос. В общем то, есть такой режим, как CUTOUT, но он работает видимо по принципу (есть альфа-нет альфы) без промежуточных значений, но он же вырезает все те полигоны, которые скрыты. Транслуцент же рендерит полигоны вообще все на экране, без учета глубины(так это вроде называется?) и я никак не могу понять, куда мне нужно засунуть хук, чтобы сделать аналогичную вырезалку как у кутаута и как она вообще должна выглядеть. Для кутаута я кстати нигде не нашел механизма. Единственное где вызывается этот кутаут это некий RegionRenderCacheBuilder.

В общем в целом известно что эти рендерлейеры юзаются в EntityRenderer и в RenderGlobal. Большего о том, как они работают мне пока выяснить не удалось. Помогите пожалуйста(
 
Сверху