Java LWJGL(OpenGL)VBO模型矩阵未正确渲染
我尝试渲染两个VBO,它们在屏幕上应有两个不同的位置。当我试图修改其中一个VBO的位置时,它会被转移到另一个VBO 示例-我更改了对象2的y位置,对象1和对象2现在都存在于该y位置 我的用于转换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
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();