2016-04-18 25 views
0

在這段代碼中,我嘗試在屏幕上渲染一個簡單的三角形,但它只顯示紅色背景,我嘗試了所有我知道要調試的東西,但我無法理解爲什麼它不會不工作Java渲染LWJGL 3.0.0

希望有人能幫助我,在此先感謝。

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

編輯:我剛纔看到,這是1日齡的問題..但哦..

我在這裏有我的懷疑:

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

你試過與BufferUtils從LWJGL庫本身更換呢?它會變成是這樣的:

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(); 
+0

是的!感謝的人,是工作,並感謝手工的方式我又比較喜歡:)謝謝 – IRONALEKS

+0

沒有問題:DI如手動更好了:P哦,順便說一下,如果你正在使用說明書一本,並希望使用字節緩衝區,翻轉部分時並不需要。 – Greffin28

+0

好,謝謝,好知道:) – IRONALEKS

2

步與偏移在字節指定,因此用於表示2個vec4s 8浮起步幅應爲32,並且顏色的偏移應該是16.

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

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

+0

我改變了它,但它仍然沒有工作:/ – IRONALEKS