LWJGL(OpenGL)VBO模型矩阵无法正确渲染

时间:2014-11-16 21:27:39

标签: java opengl shader lwjgl 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);

请注意,位置,旋转和比例都是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是VBO,模型是着色器制服,相机是相机,ss是着色器程序,ss.pId是程序ID。

我绘制VBO的代码:请注意,这可以在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。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你的整个程序结构看起来很不寻常,我相信这是绊倒你的一部分。例如,虽然我全部用于封装,但是在对象中包装单个制服,就像您似乎正在使用model变量一样,将它推得太过恕我直言。统一值实际上是着色器程序的属性,而不是独立对象。

无论如何,在没有深入设计方面,我相信你的主要问题是在这个代码序列中(省略了部分):

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

这些调用中的第二个将覆盖第一个调用的值,而不会使用第一个调用。当您稍后渲染对象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();

答案 1 :(得分:0)

Matrix变换应用于所有内容,而不仅仅是单个VBO。

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