lwjgl Обновление VBO (цвет, вершины) через JSlider

Извините за мой плохой английский. У меня проблема с обновлением VBO через JSlider и stateChanged-Event. В общем, я хочу разобраться сам, но я застрял в данный момент. поэтому мой первый вопрос заключается в том, как манипулировать (обновлять) vbo, когда был задан следующий код:

    public void update(){
    farbe = (float)slider_c.getValue()/100f;
    // x = (float)slider_x.getValue()/100f;
    // y = (float)slider_y.getValue()/100f;
}

public float[] getPosition()
{
    return new float[]{x,y};
}



/* Run Methode: window is started here
 * Definition of frame loop
 */
public void run() {
    try{
        initWindow();
        GL.createCapabilities();
        initBuffers();
        initShaders();
        // Game Loop
        while (glfwWindowShouldClose(window) == GL_FALSE) {
            // initBuffers();
            frame();
            glfwSwapBuffers(window);
            glfwPollEvents();

        }
    }
    finally {
        // Clean up
        glfwTerminate();
        errorCallback.release();
        glDeleteProgram(program);
        System.exit(0);
    }
}

private void frame() {
    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}

private void initBuffers() {
    // from the secound one

    if (vao > -1) {
        glDeleteBuffers(vao);
        glDeleteVertexArrays(vboPosition);
        glDeleteVertexArrays(vboColor);
    }

    vao = glGenVertexArrays();
    glBindVertexArray(vao);

    vboPosition = glGenBuffers();

    // x y z w
    float[] positions2 = new float[]{
            0.5f, 0.0f, 0.0f, 1.0f, // 1. Point
            0.0f, 0.5f, 0.0f, 1.0f,  // 2. Point
            0.0f, 0.0f, 0.5f, 1.0f
    };


    FloatBuffer dataBuffer = BufferUtils.createFloatBuffer(positions2.length);
    dataBuffer.put(positions2);
    dataBuffer.flip();
    glBindBuffer(GL_ARRAY_BUFFER, vboPosition);
    // alloctate memory on the graphics card and upload bytes to it
    glBufferData(GL_ARRAY_BUFFER, dataBuffer, GL_STATIC_DRAW);
    GLUtil.checkGLError(); 

    glEnableVertexAttribArray(0); // Position is index 0
    glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0L);

    GLUtil.checkGLError();

    vboColor = glGenBuffers();
    // x y z w
    float[] colors = new float[]{
            1f, 0f, 0f, 1f, // P1 = red
            0f, 1f, 0f, 1f, // green
            0f, 0f, 1f, 1f, // blue
    };

    dataBuffer = BufferUtils.createFloatBuffer(colors.length);
    dataBuffer.put(colors);
    dataBuffer.flip();
    glBindBuffer(GL_ARRAY_BUFFER, vboColor);
    glBufferData(GL_ARRAY_BUFFER, dataBuffer, GL_STATIC_DRAW);
    GLUtil.checkGLError(); 

    glEnableVertexAttribArray(1); // COLOR is index 1
    glVertexAttribPointer(1, 4, GL_FLOAT, false, 0, 0L);

    GLUtil.checkGLError();
}

private void initWindow() {
    System.out.println("LWJGL version: " + Version.getVersion());
    glfwSetErrorCallback(errorCallback = GLFWErrorCallback
            .createPrint(System.err));

    if (glfwInit() != GL_TRUE)
        throw new IllegalStateException("Unable to initialize GLFW");

    glfwDefaultWindowHints();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    // glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_ANY_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    window = glfwCreateWindow(WIDTH, HEIGHT, "Demo", NULL, NULL);
    if (window == NULL)
        throw new RuntimeException("Failed to create the GLFW window");

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    glfwShowWindow(window);
}

Я надеюсь, что кто-то может помочь мне с этим. если вам нужна дополнительная информация - я слежу за этим постом и немедленно отвечу.

наилучшие пожелания


person manCRO    schedule 25.04.2016    source источник
comment
что происходит, когда вы включаете initBuffers();?   -  person Nadir    schedule 25.04.2016
comment
Когда я включаю его в цикле while, программа немедленно закрывается :( даже когда я отключаю его в блоке try.   -  person manCRO    schedule 25.04.2016
comment
можете ли вы поместить блок catch в свой блок try-finally, чтобы перехватывать исключения, которые может генерировать GLUtil.checkGLError()? А затем опубликуйте трассировку стека   -  person Nadir    schedule 25.04.2016


Ответы (1)


private void updateColors() {
    float[] newColors = new float[]{
            newColor, 0f, 0f, 1f, // P1 = red
            0f, 1f, 0f, 1f, // green
            0f, 0f, 1f, 1f, // blue
    };
    FloatBuffer dataBuffer = BufferUtils.createFloatBuffer(newColors.length);
    dataBuffer.put(newColors);
    dataBuffer.flip();
    glBindBuffer(GL_ARRAY_BUFFER, vboColor);
    // alloctate memory on the graphics card and upload bytes to it
    glBufferData(GL_ARRAY_BUFFER, dataBuffer, GL_STATIC_DRAW);
    glEnableVertexAttribArray(1); // Color at index 1
}

Я решил это, используя метод, показанный выше, в цикле while (цикл кадра).

person manCRO    schedule 26.04.2016
comment
Не делайте этого flip() после вставки в буфер. Используйте rewind() или position(0) - person elect; 26.04.2016