2016-04-18 8 views
0

In diesem Code versuche ich ein einfaches Dreieck auf dem Bildschirm zu rendern, aber es zeigt nur den roten Hintergrund, ich habe versucht, alles, was ich weiß zu debuggen, aber ich kann nicht verstehen, warum es nicht tut 't ArbeitJava-Rendering LWJGL 3.0.0

Hoffe jemand kann mir helfen, danke im Voraus.

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; 
} 

My Vertexshader

#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; 
} 

My Fragment-Shader

#version 330 core 

out vec4 color; 

in vec4 colorout; 

void main() 
{ 
    color = colorout; 
} 

Antwort

2

EDIT: Ich habe gerade gesehen, dass diese 1 Tag alte Frage war .. aber naja ..

Ich habe meinen Verdacht hier:

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

Haben Sie versucht, Ersetzen Sie dies durch BufferUtils von Lwjgl Bibliothek selbst? Es würde sich herausstellen, so etwas sein:

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

Oder, wenn Sie das Handbuch ein wünschen ..

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

Ja! Danke Mann, das hat funktioniert, und danke für die manuelle Art und Weise, ich mag es besser :) Nochmals vielen Dank – IRONALEKS

+0

Kein Problem: DI wie das Handbuch besser auch: p Ach übrigens, wenn Sie das Handbuch verwenden und das verwenden möchten bytebuffer, der flipping Teil ist nicht notwendig. – Greffin28

+0

Ok danke, gut zu wissen :) – IRONALEKS

2

Stride und Offsets in Bytes spezifiziert sind, so dass der Schritt für 8 Schwimmer 2 vec4s repräsentiere 32 sein sollte, und der Offset für die Farbe sollte 16 sein.

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

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

+0

Habe ich es, aber es ist immer noch nicht funktioniert:/ – IRONALEKS