我想要渲染两个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。
感谢您的帮助。
答案 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。
我的建议是转换,绘制,然后为下一次抽奖做一个反向转换。