Вопрос Проблема с Scissor

Начинающий
Статус
Оффлайн
Регистрация
4 Апр 2021
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Здравствуйте, форумчане. Проблема в том, что когда я нахожусь в оконном режиме, растянутым на весь экран, ножницы из opengl правильно обрезают зону рендера кнопок, и скролл работает правильно. Но стоит мне изменить разрешение (перейти в полноэкранный режим, изменить размер самого окна), то зона обрезания сдвигается (особенно вверх), хоть я учитываю GuiScaledHeight в расчёте координат.

Код для обрезки:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = (window.getGuiScaledHeight() - y - height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    GL11.glEnable(GL11.GL_SCISSOR_TEST);
    GL11.glScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}
Рендер категорий и кнопок с обрезанием:
public void render(MatrixStack ms, int x, int y, float ticks) {
    // ... отрисовка ректов категорий
    
    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    GL11.glDisable(GL11.GL_SCISSOR_TEST);
}
 
Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2024
Сообщения
165
Реакции[?]
4
Поинты[?]
1K
Здравствуйте, форумчане. Проблема в том, что когда я нахожусь в оконном режиме, растянутым на весь экран, ножницы из opengl правильно обрезают зону рендера кнопок, и скролл работает правильно. Но стоит мне изменить разрешение (перейти в полноэкранный режим, изменить размер самого окна), то зона обрезания сдвигается (особенно вверх), хоть я учитываю GuiScaledHeight в расчёте координат.

Код для обрезки:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = (window.getGuiScaledHeight() - y - height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    GL11.glEnable(GL11.GL_SCISSOR_TEST);
    GL11.glScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}
Рендер категорий и кнопок с обрезанием:
public void render(MatrixStack ms, int x, int y, float ticks) {
    // ... отрисовка ректов категорий
   
    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    GL11.glDisable(GL11.GL_SCISSOR_TEST);
}
Вроде нужно юзать не (window.getGuiScaledHeight() а просто getHeight()
 
Начинающий
Статус
Оффлайн
Регистрация
10 Июл 2024
Сообщения
126
Реакции[?]
2
Поинты[?]
0
Здравствуйте, форумчане. Проблема в том, что когда я нахожусь в оконном режиме, растянутым на весь экран, ножницы из opengl правильно обрезают зону рендера кнопок, и скролл работает правильно. Но стоит мне изменить разрешение (перейти в полноэкранный режим, изменить размер самого окна), то зона обрезания сдвигается (особенно вверх), хоть я учитываю GuiScaledHeight в расчёте координат.

Код для обрезки:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = (window.getGuiScaledHeight() - y - height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    GL11.glEnable(GL11.GL_SCISSOR_TEST);
    GL11.glScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}
Рендер категорий и кнопок с обрезанием:
public void render(MatrixStack ms, int x, int y, float ticks) {
    // ... отрисовка ректов категорий
   
    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    GL11.glDisable(GL11.GL_SCISSOR_TEST);
}
попробуй использовать mc.getMainWindow()
 
Forge Api ;-;
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2023
Сообщения
489
Реакции[?]
8
Поинты[?]
9K
Здравствуйте, форумчане. Проблема в том, что когда я нахожусь в оконном режиме, растянутым на весь экран, ножницы из opengl правильно обрезают зону рендера кнопок, и скролл работает правильно. Но стоит мне изменить разрешение (перейти в полноэкранный режим, изменить размер самого окна), то зона обрезания сдвигается (особенно вверх), хоть я учитываю GuiScaledHeight в расчёте координат.

Код для обрезки:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = (window.getGuiScaledHeight() - y - height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    GL11.glEnable(GL11.GL_SCISSOR_TEST);
    GL11.glScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}
Рендер категорий и кнопок с обрезанием:
public void render(MatrixStack ms, int x, int y, float ticks) {
    // ... отрисовка ректов категорий
   
    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    GL11.glDisable(GL11.GL_SCISSOR_TEST);
}
делай через RenderSystem
 
Начинающий
Статус
Оффлайн
Регистрация
4 Апр 2021
Сообщения
11
Реакции[?]
0
Поинты[?]
0
делай через RenderSystem
может я тебя не понял, но вот, переделал на RenderSystem, эффект тот же
Java:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = (window.getGuiScaledHeight() - y - height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    RenderSystem.enableScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}

public void render(MatrixStack ms, int x, int y, float ticks) {

    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    RenderSystem.disableScissor();
}
 
Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2024
Сообщения
165
Реакции[?]
4
Поинты[?]
1K
может я тебя не понял, но вот, переделал на RenderSystem, эффект тот же
Java:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = (window.getGuiScaledHeight() - y - height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    RenderSystem.enableScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}

public void render(MatrixStack ms, int x, int y, float ticks) {

    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    RenderSystem.disableScissor();
}
Java:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = window.getHeight() - (y + height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    RenderSystem.enableScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}

public void render(MatrixStack ms, int x, int y, float ticks) {

    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    RenderSystem.disableScissor();
}
Пробуй это
 
Начинающий
Статус
Оффлайн
Регистрация
4 Апр 2021
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Java:
private void applyScissor(int x, int y, int width, int height) {
    int scaleFactor = (int) window.getGuiScale();
    int scaledX = x * scaleFactor;
    int scaledY = window.getHeight() - (y + height) * scaleFactor;
    int scaledWidth = width * scaleFactor;
    int scaledHeight = height * scaleFactor;

    RenderSystem.enableScissor(scaledX, scaledY, scaledWidth, scaledHeight);
}

public void render(MatrixStack ms, int x, int y, float ticks) {

    applyScissor(this.x, this.y + 16, this.width, this.height);

    for(Button button : buttonList) {
        button.render(ms, x, y, ticks);
    }

    RenderSystem.disableScissor();
}
Пробуй это
Сделал, эффект такой же. Вообще не знаю как быть :confused:
 
Начинающий
Статус
Оффлайн
Регистрация
4 Апр 2021
Сообщения
11
Реакции[?]
0
Поинты[?]
0
GL11.glScissor(x * scaleFactor, (window.getScaledHeight() - height) * scaleFactor, (width - x) * scaleFactor, (height - y) * scaleFactor);
Всё также, только появилась ошибка
[19:35:03] [Render thread/INFO] [minecraft/GlDebugTextUtils]: OpenGL debug message, id=1281, source=API, type=ERROR, severity=HIGH, message=GL_INVALID_VALUE error generated. Width and height must not be negative.
 
Пользователь
Статус
Оффлайн
Регистрация
22 Авг 2022
Сообщения
298
Реакции[?]
44
Поинты[?]
34K
Сверху Снизу