Обрезка рендера

Версия Minecraft
1.11.2
1,015
9
102
Как сделать так, что бы только какая-либо часть полигонов рендрилась. Т.е. у меня есть много разных полигонов с текстурами, и мне надо, что бы они плавно листались вверх и вниз, но что бы отображалась только середина (ну слайдер типо). Но вот с glScissors не получается, ибо оно обрезает только область экрана, не матрицу. И режет оно прямоугольником, а если мне надо обрезать трапецией, например?
 
Решение
Можно использовать стенсил. Отключаешь запись в цвет (glColorMask), включаешь стенсил тест, рисуешь маску стенсила (текстурой, например), возвращаешь запись в цвет, рисуешь то, что надо рисовать по маске, выключаешь стенсил тест.
Плюсы в том, что можно задавать любую форму маски и делать это рисуя полигончики с текстурами в мире.
Гуглиться должно легко, на практике это делается несколько сложнее, чем звучит из моих уст.
Скорее всего у тебя ряд картинок, скорее всего в одном файле (атласе или как их), скорее всего ты можешь просто рендерить статичный полигон, а на него цеплять кусочек текстуры (V = 0.25, например). Скорее всего хд


Ну а если я не угадал, то делай цикл и либо через if, либо через switch-case, либо через массив выбирай нужный полигон и рендерь его... бред сказал, конечно, но вдург поможет
 
Dahaka написал(а):
Сначала рисуй свои "полигоны", затем слайдер и прочую поверхностную шелуху. А вообще, glScissor прекрасно справляется, если написать для него удобную обертку.

Как чё рисовать я знаю, но вот проблема в том, что для создания обертки мне надо знать как покачивается игрок во время ходьбы
 
Можно использовать стенсил. Отключаешь запись в цвет (glColorMask), включаешь стенсил тест, рисуешь маску стенсила (текстурой, например), возвращаешь запись в цвет, рисуешь то, что надо рисовать по маске, выключаешь стенсил тест.
Плюсы в том, что можно задавать любую форму маски и делать это рисуя полигончики с текстурами в мире.
Гуглиться должно легко, на практике это делается несколько сложнее, чем звучит из моих уст.
 
Прочитал про трафареты. В итоге написал вот такой код, который не работает
Код:
       glColorMask(false, false, false, false);
        glEnable(GL_STENCIL_TEST);
        glStencilFunc(GL_ALWAYS, 1, 0);
        glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

        buf.begin(GL_POLYGON, DefaultVertexFormats.POSITION);
        buf.pos(0, 0, 0.001f).endVertex();
        buf.pos(0, -0.9f, 0.001f).endVertex();
        buf.pos(1.6f, -0.9f, 0.001f).endVertex();
        buf.pos(1.6f, 0, 0.001f).endVertex();
        tes.draw();

        glStencilFunc(GL_EQUAL, 1, 0);
        glColorMask(true, true, true, true);
        glColor3d(1,1,1);
        drawElements();
        glDisable(GL_STENCIL_TEST);
 
У тебя маска неправильная. Поставь 0xFF, хотя и 1 достаточно.
На всякий случай:
1) Не забудь стирать стенсил - glClear(GL_STENCIL_BUFFER_BIT)
2) Надо удостовериться, что дисплей был создан со стенсилбитами. На старых версиях (1.6.4, например) это поведение задается в классе ForgeHooksClient#createDisplay. Я помню, что оптифайн, вроде, это поведение мог перезаписывать.
 
Вот, теперь всё работает. Вместо glClear(GL_STENCIL_BUFFER_BIT); сделал рабочий костыль:

Код:
glColorMask(false, false, false, false);
        glStencilFunc(GL_ALWAYS, 0, 0xFF);
        glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);

        buf.begin(GL_POLYGON, DefaultVertexFormats.POSITION);
        buf.pos(-5, 20, 0).endVertex();
        buf.pos(-5, -20, 0).endVertex();
        buf.pos(5, -20, 0).endVertex();
        buf.pos(5, 20, 0).endVertex();
        tes.draw();

        glColorMask(true, true, true, true);


Oldestkon написал(а):
Не в том месте вызываешь, вероятно. Надо делать это там, где забинден нужный framebuffer майна, либо биндить руками и возвращать предыдущий, чтоб не сломать ничего.

А где он забинден?
 
Назад
Сверху