【问题标题】:LWJGL (OpenGL) VBO model matrix not rendering correctlyLWJGL (OpenGL) VBO 模型矩阵未正确渲染
【发布时间】:2014-11-16 21:27:38
【问题描述】:

我有两个要渲染的 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,model是shader uniform,camera是camera,ss是shader program,ss.pId是program 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。

感谢您的帮助。

【问题讨论】:

  • 您实际上是在哪里绘制对象?
  • 不知道你说的 where 是什么意思
  • 您的绘图调用在代码中的什么位置?我在您的“绘制 VBO 的代码”中没有看到任何绘制调用。
  • 我刚加了,希望对你有帮助

标签: java opengl shader lwjgl vbo


【解决方案1】:

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

无论如何,无需深入探讨设计方面,我相信您的主要问题在于此代码序列(省略了部分):

// 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();

【讨论】:

    【解决方案2】:

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

    我的建议是变换、绘制,然后为下一次绘制进行反向变换。

    【讨论】:

    • 即使我只是修改模型矩阵?
    • 我会根据你的建议尝试一些不同的东西,谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多