OpenGL 4.3 Java不在窗口中渲染

时间:2015-09-25 21:49:15

标签: java opengl game-engine

我正在关注ThinMatrix的OpenGL 3D游戏教程系列,除了窗口中没有任何内容外,一切似乎都能正常工作。我到了第5段视频。

我的装载程序类

package org.voxsim;


import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.List;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;

public class Loader {

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

    public Models loadToVao(float[] pos, int[] ind) {
        int vaoId = createVao();
        bindIndBuffer(ind);
        storeData(0,pos);
        unbind();
        return new Models(vaoId, ind.length);
    }

    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 storeData(int num, float[] data) {
        int VboId = GL15.glGenBuffers();
        vbos.add(VboId);
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VboId);
        FloatBuffer buffer = storeInFloatBuffer(data);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
        GL20.glVertexAttribPointer(num,3,GL11.GL_FLOAT,false,0,0);
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    }

    private void unbind() {
        GL30.glBindVertexArray(0);
    }

    private void bindIndBuffer(int[] ind) {
        int vboId = GL15.glGenBuffers();
        vbos.add(vboId);
        GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboId);
        IntBuffer buffer = storeInIntBuffer(ind);
        GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
    }

    private IntBuffer storeInIntBuffer(int[] data) {
        IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
        buffer.put(data);
        buffer.flip();
        return buffer;
    }

    private FloatBuffer storeInFloatBuffer(float[] data) {
        FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
        buffer.put(data);
        buffer.flip();
        return buffer;
    }
}

我的渲染类

package org.voxsim;

import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;

public class Render {

    public void render(Models model) {
        GL11.glColor4f(0.5f, 0.9f, 0.2f, 1.0f);
        GL30.glBindVertexArray(model.getVaoID());
        GL20.glEnableVertexAttribArray(0);
        GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);
    }
}

我的模特课

package org.voxsim;

public class Models {

    private int vaoID;
    private int vaoNum;

    public Models(int vaoID, int vaoNum) {
        this.vaoID = vaoID;
        this.vaoNum = vaoNum;
    }

    public int getVaoID() {
        return vaoID;
    }

    public int getVertexCount() {
        return vaoNum;
    }
}

我的主要课程

package org.voxsim;

import static org.lwjgl.glfw.GLFW.glfwWindowShouldClose;
import static org.lwjgl.opengl.GL11.GL_FALSE;

import org.lwjgl.opengl.GL30;
import org.lwjgl.opengl.GLCapabilities;
import org.voxsim.game.Block;
import org.voxsim.shaders.Shader;
import org.voxsim.shaders.Static;

public class Game {

    static public int width = 600;
    static public int height = 400;
    static public int vsync = 1;

    static public String title = "VoxSim";

    static private Loader loader = new Loader();
    static private Render render = new Render();

    private static void loop() {

        Shader shader = new Static();

        float[] v = {
                -0.5f,0.5f,0,
                -0.5f,-0.5f,0,
                0.5f,-0.5f,0,
                0.5f,0.5f,0
        };

        int[] ind = {
                0,1,3,
                3,1,2
        };

        Models model = loader.loadToVao(v, ind);

        while (glfwWindowShouldClose(DisplayManager.windowID) == GL_FALSE) {
            DisplayManager.updateDisplay();
            shader.start();
            render.render(model);
            shader.stop();
        }
        shader.cleanUp();
    }

    public static void main(String[] args) {
        DisplayManager.createDisplay();

        DisplayManager.updateDisplay();

        loop();


        loader.cleanUp();
    }

}

我完全按照教程,但我不知道错误。我正在使用英特尔高清显卡4400运行英特尔第四代i3,在Windows 10上使用4GB内存 OpenGL版本4.3, OpenCL版本1.2,和 Shader Model Version 5

0 个答案:

没有答案
相关问题