Java渲染LWJGL 3.0.0

时间:2016-04-18 20:01:48

标签: java opengl rendering lwjgl

在这段代码中,我尝试在屏幕上呈现一个简单的三角形,但它只显示红色背景,我已经尝试了所有我知道的调试但我无法理解为什么它没有工作

希望有人可以帮助我,提前谢谢。

public float vertices[] = new float[]
{
        -0.5f,-0.5f,0.0f,1.0f,

        0.0f,1.0f,0.0f,1.0f,

        0.0f,0.5f,0.0f,1.0f,

        0.0f,1.0f,0.0f,1.0f,

        0.5f,-0.5f,0.0f,1.0f,

        0.0f,1.0f,0.0f,1.0f
};



public TEST()
{

}


public int start() throws IOException
{
    glfwInit();

    long window = glfwCreateWindow(1000, 1000, "HAHA", NULL, NULL);
    glfwMakeContextCurrent(window);
    glfwShowWindow(window);
    GLFWKeyCallback keycallback = new GLFWKeyCallback()
    {

        @Override
        public void invoke(long window, int key, int scancode, int action, int mods)
        {
            if(key==GLFW_KEY_ESCAPE&&action==GLFW_PRESS)
            {
                glfwSetWindowShouldClose(window, GLFW_TRUE);
            }
        }
    };
    glfwSetKeyCallback(window,keycallback );
    GLFWErrorCallback errorcallback = new GLFWErrorCallback()
    {

        @Override
        public void invoke(int error, long description)
        {
            System.out.println("ERROR CODE: " + error + "  ERROR DESCRITPION: "+description);
        }
    };
    glfwSetErrorCallback(errorcallback);


    GL.createCapabilities();

    glViewport(0, 0, 1000, 1000);
    //////////////////////////
    int VAO = glGenVertexArrays();
    int VBO = glGenBuffers();
    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    FloatBuffer buffer = FloatBuffer.allocate(vertices.length);
    buffer.clear();
    buffer.put(vertices);
    buffer.flip();
    glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 4, GL_FLOAT, false, 8, 0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 4, GL_FLOAT, false, 8, 4);
    glEnableVertexAttribArray(1);

    buffer.clear();
    buffer=null;
    System.gc();

    glBindVertexArray(0);
    ///////////////////////
    ///////////////////////
    LoadFile loader = new LoadFile("res/shader.vs", "res/shader.frag");

    int vertexshader = glCreateShader(GL_VERTEX_SHADER);
    int fragmentshader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vertexshader, loader.readVertex());
    glShaderSource(fragmentshader, loader.readFragment());

    glCompileShader(vertexshader);
    glCompileShader(fragmentshader);

    System.out.println(glGetShaderInfoLog(vertexshader));
    System.out.println(glGetShaderInfoLog(fragmentshader));


    int program = glCreateProgram();

    glAttachShader(program, vertexshader);
    glAttachShader(program, fragmentshader);

    glLinkProgram(program);

    glDeleteShader(vertexshader);
    glDeleteShader(fragmentshader);

    System.out.println(glGetProgramInfoLog(program));
    ///////////////////////////

    boolean running=true;
    while(running&&glfwWindowShouldClose(window)==GLFW_FALSE)
    {
        glfwPollEvents();
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glClearColor(1.0f, 0.0f, 0.0f, 1.0f);

        glUseProgram(program);

        glBindVertexArray(VAO);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glBindVertexArray(0);

        glUseProgram(0);

        glfwSwapInterval(1);
        glfwSwapBuffers(window);
    }

    System.out.println(glGetError());
    glfwTerminate();

    return 0;
}

我的顶点着色器

#version 330 core

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 colorin;

out vec4 colorout;

void main()
{
    gl_Position = position;
    colorout=colorin;
}

我的片段着色器

#version 330 core

out vec4 color;

in vec4 colorout;

void main()
{
    color = colorout;
}

2 个答案:

答案 0 :(得分:2)

bytes 中指定了步幅和偏移量,因此代表2个vec4s的8个浮点数的步幅应为32,颜色的偏移量应为16。

glVertexAttribPointer(0, 4, GL_FLOAT, false, 32, 0);

glVertexAttribPointer(1, 4, GL_FLOAT, false, 32, 16);

答案 1 :(得分:2)

编辑:我刚看到这是一天的问题......但是哦,好吧..

我怀疑在这里:

FloatBuffer buffer = FloatBuffer.allocate(vertices.length);
buffer.clear();
buffer.put(vertices);
buffer.flip();
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);

您是否尝试将此替换为lwjgl库本身的 BufferUtils ?结果会是这样的:

FloatBuffer buff = BufferUtils.createFloatBuffer(vertices.length);
buff.put(vertices);
buff.flip();

或者,如果你想要手册......

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
byteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
floatBuffer.put(vertices);
floatBuffer.flip();