Создание GUI через drawModalRectWithCustomSizedTexture

Версия Minecraft
1.12.2
Всем привет, пытаюсь залить текстуру для хотбара разрешением 936х134.

drawGuiContainerBackgroundLayer:
@Override
    protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
        GlStateManager.pushMatrix();
        int xTexture = 936;
        int yTexture = 134;
        this.mc.renderEngine.bindTexture(INVENTORY_GUI_TEXTURE);
        drawModalRectWithCustomSizedTexture(0, 0, 0, 0, xTexture, yTexture, xTexture, yTexture);
        GlStateManager.popMatrix();
    }

По итогу моя текстура становится слишком большой и вылазит за пределы экрана, хотя казалось бы, что у нее разрешение 936х134, а разрешение экрана Майнкрафта гораздо выше.

Пытался через GlStateManager.scale(), но соотвественно слишком падает качество текстуры и появляются с ней проблемы, хотелось бы этого избежать. Что посоветуете сделать?
 
Решение
Всем привет, пытаюсь залить текстуру для хотбара разрешением 936х134.
Попробуй переписать встроенную функцию отрисовки от int на double
(Под капотом там есть магическое число 0,00390625 или 1/256, оно участвует в мат. операциях, и там еще точность страдает)

На счет повышения качества - ХЗ, но обрезать текстуру в "нецелое количество пикселей" этим способом у меня удавалось
434
41
110
Всем привет, пытаюсь залить текстуру для хотбара разрешением 936х134.
Попробуй переписать встроенную функцию отрисовки от int на double
(Под капотом там есть магическое число 0,00390625 или 1/256, оно участвует в мат. операциях, и там еще точность страдает)

На счет повышения качества - ХЗ, но обрезать текстуру в "нецелое количество пикселей" этим способом у меня удавалось
 
116
13
13
По итогу моя текстура становится слишком большой и вылазит за пределы экрана, хотя казалось бы, что у нее разрешение 936х134, а разрешение экрана Майнкрафта гораздо выше.
Дополню, что отрисовка твоей текстуры при помощи tessellator'а зависит от установленного масштаба в настройках игры. Например, при самом мелком масштабе все будет отображено нормально. Так что в любом случае придется делать расчет с учетом текущего масштаба
 
Решил проблему тем, что растянул текстуру до 1024х1024 и не стал париться с кастомным разрешением. Сделал отдельный класс, в нем сделал метод и поменял значения типа переменных ширины и высоты с int на double и теперь просто обрезаю до нужных мне пикселей. Если это кому то в будущем пригодится, то держите. (не знаю правильно ли я понял совет, но сделал как сделал)


drawTexturedModalRect:
public void drawTexturedModalRect(int x, int y, int textureX, int textureY, double width, double height) {
            float f = 0.00390625F;
            float f1 = 0.00390625F;
            Tessellator tessellator = Tessellator.getInstance();
            BufferBuilder bufferbuilder = tessellator.getBuffer();
            bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
            bufferbuilder.pos((double)(x), (double)(y + height), (double)this.zLevel).tex((double)((float)(textureX) * 0.00390625F), (double)((float)(textureY + height) * 0.00390625F)).endVertex();
            bufferbuilder.pos((double)(x + width), (double)(y + height), (double)this.zLevel).tex((double)((float)(textureX + width) * 0.00390625F), (double)((float)(textureY + height) * 0.00390625F)).endVertex();
            bufferbuilder.pos((double)(x + width), (double)(y), (double)this.zLevel).tex((double)((float)(textureX + width) * 0.00390625F), (double)((float)(textureY) * 0.00390625F)).endVertex();
            bufferbuilder.pos((double)(x), (double)(y), (double)this.zLevel).tex((double)((float)(textureX) * 0.00390625F), (double)((float)(textureY) * 0.00390625F)).endVertex();
            tessellator.draw();
    }
 
434
41
110
Можно было немного лаконичнее без лишних привидений типов, у меня вот так было
Java:
    private void drawTexturedModalRect0(double x, double y, double textureX, double textureY, double width, double height) {
        //float f1 = 0.00390625F; //1/256
        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder bufferbuilder = tessellator.getBuffer();
        bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
        bufferbuilder.pos(x, y + height, this.zLevel).tex(textureX * 0.00390625, (textureY + height) * 0.00390625).endVertex();
        bufferbuilder.pos(x + width, y + height, this.zLevel).tex((textureX + width) * 0.00390625, (textureY + height) * 0.00390625).endVertex();
        bufferbuilder.pos(x + width, y, this.zLevel).tex((textureX + width) * 0.00390625, textureY * 0.00390625).endVertex();
        bufferbuilder.pos(x, y, this.zLevel).tex(textureX * 0.00390625, textureY * 0.00390625).endVertex();
        tessellator.draw();
    }
 
Сверху