Java LWJGL(OpenGL)VBO模型矩阵未正确渲染

Java LWJGL(OpenGL)VBO模型矩阵未正确渲染,java,opengl,shader,lwjgl,vbo,Java,Opengl,Shader,Lwjgl,Vbo,我尝试渲染两个VBO,它们在屏幕上应有两个不同的位置。当我试图修改其中一个VBO的位置时,它会被转移到另一个VBO 示例-我更改了对象2的y位置,对象1和对象2现在都存在于该y位置 我的用于转换VBO的代码: Matrix4f.scale(scale, modelMatrix, modelMatrix); Matrix4f.translate(position, modelMatrix, modelMatrix); Matrix4f.rotate(Toolkit.degT

我尝试渲染两个VBO,它们在屏幕上应有两个不同的位置。当我试图修改其中一个VBO的位置时,它会被转移到另一个VBO

示例-我更改了对象2的y位置,对象1和对象2现在都存在于该y位置

我的用于转换VBO的代码:

    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);
请注意,位置、旋转和缩放都是矢量3fs,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是VBO,模型是着色器统一,摄影机是摄影机,ss是着色器程序,ss.pId是程序id

我绘制VBOs的代码:注意,这在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是几何类

g包含索引缓冲区id和顶点缓冲区id。 t包含纹理和id


感谢您的帮助。

矩阵变换应用于所有事物,而不仅仅是单个VBO


我的建议是转换,绘制,然后为下一个绘制做一个反向转换。

您的整个程序结构看起来相当不寻常,我相信这是绊倒您的部分原因。例如,虽然我完全支持封装,但在对象中封装单个统一,就像您使用
model
变量所做的那样,将它推得太远了。统一值实际上是着色器程序的属性,而不是独立对象

无论如何,在不深入设计方面的情况下,我相信您的主要问题在于以下代码序列(省略部分):

第二个调用将覆盖第一个调用中写入的值,而不使用第一个调用。稍后渲染对象1和对象2时,它们都将使用第二个值作为统一

只要对两个对象使用相同的着色器程序(这是一件好事,除非它们确实需要不同的着色器),就必须在绘制每个对象之前设置统一的值

因此,设置制服的调用应进入draw函数,其中结构大致如下所示:

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

您实际在哪里绘制对象?不确定代码中的绘制调用是什么意思?我在你的“绘制VBO的代码”中没有看到任何绘制调用。我只是添加了它,希望它能帮助我修改模型矩阵?我会根据你的建议尝试一些不同的方法,谢谢你的帮助
// calculate camera.matrixBuffer for object 1
model.Matrix4(camera.matrixBuffer);
obj1.draw();
...
// calculate camera.matrixBuffer for object 2
model.Matrix4(camera.matrixBuffer);
obj2.draw();