Использование масок

Версия Minecraft
1.19.4
API
Forge

GoogleTan

Картошка :3
1,354
43
310
Есть задача нарисовать текстуру, обрезав её по черно-белому шаблону. Я пробовала:

Kotlin:
glEnable(GL_BLEND)
glBlendFunc(GL_ONE, GL_ZERO)
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO)
renderQuad(stack, MASK)
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)
renderQuad(stack, TEXTURE)
и так:
Kotlin:
glEnable(GL_STENCIL_TEST)
glStencilFunc(GL_ALWAYS, 1, 1)
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE)
renderQuad(stack, MASK)
glEnable(GL_STENCIL_TEST)
glStencilFunc(GL_EQUAL, 1, 1)
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP)
renderQuad(stack, TEXTURE)
glDisable(GL_STENCIL_TEST)
Где renderQuad рисует квадрат с заданной текстурой, используя тесселятор.
Но оба способа не дали ровным счётом ничего. Рисуется просто текстура. Как это можно сделать? Или где такое можно посмотреть?
 
Последнее редактирование:
1,038
57
229
Сделать это можно только двумя способами:
1)
берём текстуру и начинаем определять границы маски в значениях от 0.0 до 1.0 (диапозон UV). Простым перебором каждого пикселя. Любым алгоритмом который вы посчитаете для этого необходимым (как например Собель) https://moluch.ru/archive/193/48447/
Я бы уменьшил маску в 16 раз если она большая и работал бы с текстурой не превышающей текстурой в 100x100 пикселей (32x32, 64x64).

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

2) использовать шейдер
тут вообще всё сделает шейдер, посмотри любой шейдер маски https://stackoverflow.com/questions/18550226/images-and-mask-in-opengl-es-2-0
Ну а в Mincraft для начала стоит просто использовать хоть какой то шейдер для отрисовки, ввести в мод, включить его, нарисовать, отключить.
LWJGL Shaders
уверен на форуме есть уже код, надо просто поиском найти: шейдер
 
Последнее редактирование:
Сверху