LWJGL Мерцание изображения при отрисовке

Рейтинг: 0Ответов: 1Опубликовано: 05.02.2023

Я написал программу, выводящую на экран цветной прямоугольник на цветном фоне при помощи OpenGL, но изображение почему-то мерцает с большой скоростью. Что у меня в коде неправильно? Пример GL кода взят из красной книги OpenGL.

Класс окна на glfw:

import org.lwjgl.opengl.GL;

import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.system.MemoryUtil.NULL;

public class Window
{
    private long handle;

    public Window()
    {
        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
        glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);

        handle = glfwCreateWindow(800, 600, "Intro", NULL, NULL);

        glfwMakeContextCurrent(handle);
        glfwSwapInterval(1);
        GL.createCapabilities();

        glfwShowWindow(handle);
    }

    public long handle()
    {
        return handle;
    }

    public boolean windowShouldClose()
    {
        return glfwWindowShouldClose(handle);
    }
}

Программа для отрисовки изображения:

import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL15.*;

public class Main
{
    public static void main(String[] args)
    {
        if (!glfwInit())
            throw new RuntimeException("Can't initialize GLFW");

        var window = createWindow();

        init();

        while (!window.windowShouldClose())
        {
            render();

            glfwSwapBuffers(window.handle());
            glfwPollEvents();
        }

        glfwTerminate();
    }

    private static Window createWindow()
    {
        return new Window();
    }

    private static void init()
    {
        glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
    }

    private static void render()
    {
        glColor3f(1.0f, 0.0f, 0.0f);
        glBegin(GL_POLYGON);
        glVertex3f(0.25f,0.25f,0.0f);
        glVertex3f(0.75f,0.25f,0.0f);
        glVertex3f(0.75f,0.75f,0.0f);
        glVertex3f(0.25f,0.75f,0.0f);
        glEnd();
        glFlush();
    }
}

Ответы

▲ 2Принят

glClear необходимо вызывать при каждой отрисовке, а не один раз в начале, иначе целевой буфер для отрисовки может оставаться заполнен мусором.