我是OpenGL的新手。我正在使用JOGL。
我有一个WorldEntity
类,表示可以渲染的东西。它具有position
和size
等属性。为了渲染,我一直在使用这种方法:
/**
* Renders the object in the world.
*/
public void render() {
gl.glTranslatef(getPosition().x, getPosition().y, getPosition().z);
gl.glRotatef(getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
// gl.glScalef(size, size, size);
gl.glCallList(drawID);
// gl.glScalef(1/size, 1/size, 1/size);
gl.glRotatef(-getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
gl.glTranslatef(-getPosition().x, -getPosition().y, -getPosition().z);
}
我一直在使用的模式是应用实体的每个属性(如位置或旋转),然后撤消它以避免破坏下一个实体渲染的状态。
取消注释缩放行会导致应用程序变得迟钝,因为它会在我的适度计算机上呈现适度的场景。我猜测浮动除法太多,无法处理每秒数千次操作。 (?)
正确的方法是什么?我可以找到一种计算量较小的方法来撤消缩放转换吗?我是否需要按比例对对象进行排序并绘制它们以减少所需的缩放变换?
感谢。
答案 0 :(得分:5)
这是你使用矩阵的地方(请耐心等待,我来自OpenGL / C编程背景):
glMatrixMode(GL_MODELVIEW); // set the matrix mode to manipulate models
glPushMatrix(); // push the matrix onto the matrix stack
// apply transformations
glTranslatef(getPosition().x, getPosition().y, getPosition().z);
glRotatef(getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
glScalef(size, size, size);
glCallList(drawID); // drawing here
glPopMatrix(); // get your original matrix back
......至少,这就是我的想法。
答案 1 :(得分:0)
这些分歧不太可能导致任何性能问题。 rfw给你通常的实现方式,但我的猜测是你的“slu”“渲染主要是因为你的GPU是瓶颈,使用矩阵堆栈不会改善性能。
当您增加绘制对象的大小时,必须处理更多像素,并且GPU必须更加努力地工作。你的CPU在这一点上所做的事情(分歧)是无关紧要的。
为了证明我的观点,请尝试保留缩放代码,但大小约为1。