Треугольник не рендерится с использованием LWJGL 3 - PullRequest
0 голосов
/ 28 февраля 2020

Я использую LWJGL 3 и пытаюсь сделать 2 треугольника, чтобы сделать прямоугольник. Фон и все остальное работает, но треугольники просто не появляются, и я не могу понять, почему.

Ниже приведена основная игра l oop:

public class MainGameLoop {
public static void main(String[] args) {

    // Creates the display window
    DisplayManager.createDisplay();

    Loader loader = new Loader();
    Renderer renderer = new Renderer();

    float[] vertices = {
        // Left bottom triangle
        -0.5f, 0.5f, 0f,
        -0.5f, -0.5f, 0f,
        0.5f, -0.5f, 0f,
        // Right top triangle
        0.5f, -0.5f, 0f,
        0.5f, 0.5f, 0f,
        -0.5f, 0.5f, 0f
    };

    RawModel model = loader.loadToVAO(vertices);

    while (!DisplayManager.isCloseRequested()) {
        renderer.prepare();
        renderer.render(model);
        DisplayManager.updateDisplay();
    }
    // Once the red X has been pressed
    loader.cleanUp();
    DisplayManager.closeDisplay();
  }
}

Вот displayManager, loader, rawModel и классы рендеринга:

public class DisplayManager {
    private static final int WIDTH = 1280;
    private static final int HEIGHT = 720;
    private static final int FPS = 120;
    private static GLFWErrorCallback errorCallback;
    private static long windowId;

    public static void createDisplay() {
        glfwSetErrorCallback(errorCallback = GLFWErrorCallback.createPrint(System.err));

        if (!glfwInit()) {
            throw new IllegalStateException("GLFW init failed.");
        }

        glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        windowId = glfwCreateWindow(WIDTH, HEIGHT, "LWJGL demo", MemoryUtil.NULL, MemoryUtil.NULL);

        if (windowId == MemoryUtil.NULL) {
            throw new IllegalStateException("Window failed.");
        }

        // link GLFW context
        glfwMakeContextCurrent(windowId);
        GL.createCapabilities();
        glfwSwapInterval(1);    // passing 1 enables Vsync
        glfwShowWindow(windowId);
    }

    public static void updateDisplay() {
        glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(windowId);          // swaps front and back frame buffers
        glfwPollEvents();                   // checks mouse and keyboard input
    }

    public static void closeDisplay() {
        // Closes the game window
        glfwDestroyWindow(windowId);
        glfwTerminate();
    }

    public static boolean isCloseRequested() {
        return (glfwWindowShouldClose(windowId));
    }
}


public class Loader {

    private List<Integer> vaos = new ArrayList<Integer>();
    private List<Integer> vbos = new ArrayList<Integer>();

    public RawModel loadToVAO(float[] positions){
        int vaoId = createVAO();
        storeDataInAttributeList(0, positions);
        unbindVAO();
        return new RawModel(vaoId, positions.length/3);     // divided by three as there are three values to a vertex coordinate (x, y, z)
    }

    public void cleanUp(){
        for(int vao:vaos){
            GL30.glDeleteVertexArrays(vao);
        }
        for(int vbo:vbos){
            GL15.glDeleteBuffers(vbo);
        }
    }

    private int createVAO(){
        int vaoId = GL30.glGenVertexArrays();
        vaos.add(vaoId);
        GL30.glBindVertexArray(vaoId);
        return vaoId;
    }

    private void storeDataInAttributeList(int attributeNumber, float[] data){
        int vboId = GL15.glGenBuffers();
        vbos.add(vboId);
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
        FloatBuffer buffer = storeDataInFloatBuffer(data);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);       // store the data into the vbo
        GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0);
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);                          // finished using VBO, so unbind
    }

    private void unbindVAO(){
        GL30.glBindVertexArray(0);      // passing 0 unbinds the currently bound VAO
    }

    private FloatBuffer storeDataInFloatBuffer(float[] data){
        FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
        buffer.put(data);
        buffer.flip();      // changes buffer from being written to to being read from
        return buffer;
    }
}

public class RawModel {

    private int vaoId;
    private int vertexCount;

    public RawModel(int vaoId, int vertexCount){
        this.vaoId = vaoId;
        this.vertexCount = vertexCount;
    }

    public int getVaoId() {
        return vaoId;
    }

    public int getVertexCount() {
        return vertexCount;
    }
}


public class Renderer {

    public void prepare(){
        GL11.glClearColor(0, 232, 252, 1);
    }

    public void render(RawModel model){
        GL30.glBindVertexArray(model.getVaoId());         // bind the VAO for the related model
        GL20.glEnableVertexAttribArray(0);          // activate attribute list for the model's VAO
        GL11.glDrawArrays(GL11.GL_TRIANGLE_FAN, 0, model.getVertexCount()); // render
        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);                         //unbind VAO
    }
}

В вышеприведенном рендере метод prepare устанавливает цвет фона, и он определенно работает, однако треугольник не появляется. Спасибо за любые исправления, идеи или общие указания.

...