2010-09-20 79 views
1

我是OpenGL的新手。我正在使用JOGL。OpenGL:如何撤消缩放?

我有一个WorldEntity类,它表示一个可以呈现的东西。它具有像positionsize这样的属性。要渲染,我已经使用这种方法:

/** 
    * 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); 
    } 

我已经使用在施加实体(如位置或旋转)的每个属性的图案,然后撤消它,以避免破坏的状态下用于下一实体呈现。

取消缩放缩放线条会导致应用程序变得更加缓慢,因为它会在适度的计算机上渲染出适度的场景。我猜测浮法部门每秒处理数千次操作太多了。 (?)

这是怎么回事?我可以找到一种计算量较小的方法来撤消缩放转换吗?我是否需要按比例排序对象并绘制它们以减少所需的缩放转换?

谢谢。

回答

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 

......至少,这是我认为它是。

0

这是不太可能的分裂将导致任何性能问题。 rfw给了你实现这个方法的常用方法,但我的猜测是你的“slugish”渲染主要是因为你的GPU是瓶颈,使用矩阵栈不会提高性能。

当您增加绘制对象的大小时,需要处理更多的像素,并且GPU必须工作更加困难。您的CPU在这一点上所做的(分部)是无关紧要的。

为了证明我的观点,尽量保持在缩放代码,但尺寸1左右。