2014-11-16 3 views
0

У меня есть два VBOs, которые я пытаюсь сделать, оба они должны иметь две разные позиции на экране. Когда я пытаюсь изменить позицию одного из VBOs, он переходит к другому.LWJGL (OpenGL) Матрица модели VBO неправильно отображается

Пример: я изменяю позицию y объекта 2, и объект 1, и объект 2 теперь существуют в этом положении y.

Мой код для преобразования РВО:

Matrix4f.scale(scale, modelMatrix, modelMatrix); 
    Matrix4f.translate(position, modelMatrix, modelMatrix); 
    Matrix4f.rotate(Toolkit.degToRad(rotation.x), new Vector3f(1f,0f,0f), modelMatrix, modelMatrix); 
    Matrix4f.rotate(Toolkit.degToRad(rotation.y), new Vector3f(0f,1f,0f), modelMatrix, modelMatrix); 
    Matrix4f.rotate(Toolkit.degToRad(rotation.z), new Vector3f(0f,0f,1f), modelMatrix, modelMatrix); 

Обратите внимание, что положение, поворот и масштаб все Vector3fs и modelMatrix хорошо, матричная модель.

Также, Toolkit.degToRad похож на метод типа Math.toRadians().

Мой код для передачи информации на шейдер:

//Apply Transformations 
    camera.reset(); 
    camera.transform(); 

    glUseProgram(ss.pId); 

    //Projection Matrix 
    camera.projectionMatrix.store(camera.matrixBuffer); 
    camera.matrixBuffer.flip(); 
    projection.Matrix4(camera.matrixBuffer); 
    //View Matrix 
    camera.viewMatrix.store(camera.matrixBuffer); 
    camera.matrixBuffer.flip(); 
    view.Matrix4(camera.matrixBuffer); 

    glUseProgram(0); 

    //Apply Transformations 
    obj.reset(); 
    obj.transform(); 

    glUseProgram(ss.pId); 

    //Object 1 
    obj.modelMatrix.store(camera.matrixBuffer); 
    camera.matrixBuffer.flip(); 
    model.Matrix4(camera.matrixBuffer); 

    glUseProgram(0); 

    //Apply Transformations 
    obj2.reset(); 
    obj2.transform(); 


    glUseProgram(ss.pId); 

    obj2.modelMatrix.store(camera.matrixBuffer); 
    camera.matrixBuffer.flip(); 
    model.Matrix4(camera.matrixBuffer); 

    glUseProgram(0); 

OBJ и obj2 являются О, модель шейдера форма, камерой является камерой, и сс является программой шейдера и ss.pId является программой Я бы.

Мой код для рисования РВО: Обратите внимание, что это находится в OBJ и obj2 и используется как этот

obj.draw(); 
obj2.draw(); 

А вот метод рисования

GL20.glUseProgram(ss.pId); 

    GL13.glActiveTexture(GL13.GL_TEXTURE0); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, t.id); 

    GL30.glBindVertexArray(g.vaoId); 
    GL20.glEnableVertexAttribArray(0); 
    GL20.glEnableVertexAttribArray(1); 
    GL20.glEnableVertexAttribArray(2); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, g.vboiId); 

    GL11.glDrawElements(GL11.GL_TRIANGLES, g.indices, GL11.GL_UNSIGNED_BYTE, 0); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
    GL20.glDisableVertexAttribArray(0); 
    GL20.glDisableVertexAttribArray(1); 
    GL20.glDisableVertexAttribArray(2); 
    GL20.glUseProgram(0); 


    GL20.glUseProgram(ss.pId); 

    GL13.glActiveTexture(GL13.GL_TEXTURE0); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, t.id); 

    GL30.glBindVertexArray(g.vaoId); 
    GL20.glEnableVertexAttribArray(0); 
    GL20.glEnableVertexAttribArray(1); 
    GL20.glEnableVertexAttribArray(2); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, g.vboiId); 

    GL11.glDrawElements(GL11.GL_TRIANGLES, g.indices, GL11.GL_UNSIGNED_BYTE, 0); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
    GL20.glDisableVertexAttribArray(0); 
    GL20.glDisableVertexAttribArray(1); 
    GL20.glDisableVertexAttribArray(2); 
    GL20.glUseProgram(0); 

г класс геометрия ,

g содержит идентификаторы буфера id и вершины buffer id. t содержит текстуру и идентификатор.

Благодарим за помощь.

+0

Где вы на самом деле рисования ваших объектов? –

+0

Не уверен, что вы подразумеваете под тем, где – irishpatrick

+0

Где в коде ваши призывы к розыгрышу? Я не вижу никаких призывов на призыв в вашем «коде для рисования VBOs». –

ответ

1

Вся ваша структура программы выглядит довольно необычно, и я считаю, что это часть того, что вас отключает. Например, в то время как я все для инкапсуляции, обертывание единой униформы в объекте, как вы, кажется, делаете с вашей переменной model, толкает ее слишком далеко IMHO. Однозначное значение действительно является атрибутом шейдерной программы, а не независимым объектом.

Во всяком случае, не вдаваясь слишком глубоко в аспекты дизайна, я считаю, ваша главная проблема в этой кодовой последовательности (с частями опущенных):

// calculate camera.matrixBuffer for object 1 
model.Matrix4(camera.matrixBuffer); 
... 
// calculate camera.matrixBuffer for object 2 
model.Matrix4(camera.matrixBuffer); 

Второй из этих вызовов будет перезаписать значение, записанное в первой один, без первого использования. Когда вы позже произведете объект 1 и объект 2, они оба будут использовать второе значение для униформы.

Пока вы используете одну и ту же программу шейдеров для обоих объектов (что хорошо, если только им не нужны разные шейдеры), вы должны установить равномерное значение, прежде чем рисовать каждый из объектов.

Так призывы установить мундиры должны идти в функцию вытяжки, где структура будет выглядеть примерно так:

// calculate camera.matrixBuffer for object 1 
model.Matrix4(camera.matrixBuffer); 
obj1.draw(); 
... 
// calculate camera.matrixBuffer for object 2 
model.Matrix4(camera.matrixBuffer); 
obj2.draw(); 
+0

Спасибо, я попробую – irishpatrick

+0

Это, похоже, отработано, спасибо за помощь. – irishpatrick

0

Матричные преобразования применяются ко всему, а не только к одному VBO.

Мое предложение было бы преобразовать, нарисовать, а затем сделать обратное преобразование для следующего розыгрыша.

+0

Даже если я просто модифицирую модельную матрицу? – irishpatrick

+0

Ну, я не знаю наверняка, но судя по вашим результатам ... –

+0

Я попробую несколько вещей, основываясь на вашем совете, спасибо за вашу помощь – irishpatrick