当前位置: 首页 > 知识库问答 >
问题:

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

闽涵蓄
2023-03-14

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

示例-我更改了对象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是well,模型矩阵。

此外,这是一个工具包。degToRad类似于数学。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是VBOs,model是着色器uniform,camera是摄影机,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。

感谢您的帮助。

共有2个答案

巩子实
2023-03-14

矩阵变换适用于一切,而不仅仅是一个单一的VBO。

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

王修为
2023-03-14

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

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

// 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();
 类似资料:
  • 注意:很抱歉链接/图片只不过是文本-作为一个新用户,我不能张贴图片,也不能张贴 所以我一直在使用被弃用的OpenGL,并在几周前决定最终转向更现代的方法。我使用Open.gl作为资源(我发现LWJGL教程是不一致和稀疏的),并且能够渲染到本教程的最后一幅图像。然而,我在下一页遇到了一些严重的问题(渲染一个立方体)。 我在这个问题上做了很多研究,并多次改进/重新组织我的代码,以便完全理解每个组件的用

  • 下面的LWJGL代码将在屏幕中心呈现一个蓝色正方形。相反,我得到了一个空白的白色屏幕。就像渲染根本不工作,或者我在屏幕外渲染。 我是OpenGL和LWJGL的新手,所以我力不从心。我浏览了所有内容,但似乎找不到任何可能与代码有关的问题。 OpenGLTest.scala VertexArray.scala

  • 每当我运行这个,窗口就会弹出,我看到这个。(当我运行游戏时,我看到了这一点) 如果您简单地创建一个新的Java项目,导入OpenGL、GLFW和LWJGL以及本机,然后复制代码,就可以重新创建它(删除包)

  • 我在使用OpenGL使颜色正常工作时遇到问题。我正确地绘制了形状,它们看起来很好,但当我调用glColor4d(r,g,b,a)时,它并没有正确地使用RGB应该指定的颜色,而是绘制了不同但相似的颜色。例如,大多数绿色绘制为完全黄色或完全绿色,任何灰色绘制为纯白。 在这个随机颜色值的短列表中,所有颜色值都绘制为实心FFFFFF白色,即使它们都不应为白色。 我用来绘制矩形的代码:

  • 在代码的开头,我已经初始化了vbo: 然后我的顶点和颜色数组: 现在我创建并绑定vbo并分配空间: 最后是渲染函数: 这应该画一个三角形,但我什么都看不见。可能glVertexPointer和glColorPointer的参数不正确。我已经阅读了opengl上关于VBO的文档。或者,我遵循了几个教程,比如:https://www.youtube.com/watch?v=KIeExgOcmv0 我的

  • 我正在尝试在OpenGL/LWJGL中制作一个简单的按钮, 我可以正确地渲染我的2D四边形,但是当我实现纹理时,整个四边形只有大约3/4的部分得到了纹理,就像这样:https://dl.dropboxusercontent.com/u/60223805/glerror1.png 如果我删除纹理坐标,我得到这个:https://dl.dropboxusercontent.com/u/60223805