gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:16:33 25 4
gpt4 key购买 nike

我有两个 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是着色器统一,camera是相机,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。

感谢您的帮助。

最佳答案

你的整个程序结构看起来相当不寻常,我相信这是让你绊倒的部分原因。例如,虽然我完全支持封装,但将单个统一包装在一个对象中,就像您似乎对 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();

关于java - LWJGL (OpenGL) VBO 模型矩阵未正确渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com