2012-03-07 65 views
0

我有以下代码将快照发送到framebuffer。我验证了framebuffer能够正常工作,并且相机正确对着物体。我曾经正确地完成了图片的制作,但它是基于错误的代码,使用了错误的视锥体。所以我决定开始新鲜(与视锥)。OpenGL截锥体,透视

目的在中间居中且是32×32块与每个块的2×2,所以64×64

我的距离为100和我的视口是128×256。我的平截头体是1到1000.0。

我对Opengl比较陌生,所以我无法完全理解frustrums和观点的概念。

我根本没有看到照片。

saveGLState(); 

const int nrPics = 360/DEGREES_BETWEEN_PICTURES; 
for (int i = 0; i < nrPics; i++) { 

    catchFbo->bind(); 
    glViewport(0, 0, PICTURE_WIDTH, PICTURE_HEIGHT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    float rat = PICTURE_WIDTH/PICTURE_HEIGHT; 
    glFrustum(- 1.0, + 1.0, - rat, + rat, 1.0, 1000.0); 
    gluPerspective(90.0f,rat,CAPT_FRUSTRUM_NEAR,CAPT_FRUSTRUM_FAR); 

    glColorMask(true, true, true, true); 
    glClearColor(0,0,0,0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 
    glEnable(GL_MULTISAMPLE); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    drawScreenshot(i); 
    catchFbo->release(); 

    QImage catchImage = catchFbo->toImage(); 
    catchImage.save("object/test" + QString::number(i) + ".png"); 
} 

glDisable(GL_MULTISAMPLE); 
restoreGLState(); 

void VoxelEditor::saveGLState() 
{ 
    glPushAttrib(GL_ALL_ATTRIB_BITS); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
} 

void VoxelEditor::restoreGLState() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 
    glPopAttrib(); 
} 

编辑:我试过只使用glFrustum或glPerspective。没有运气。

+2

你为什么要调用'glFrustum()'和'gluPerspective()'?他们做同样的事情。你可能应该删除其中的一个。 (另外,它的拼写是“截锥体”,而不是“frustrum”,我犯了同样的错误!)你的近剪裁平面是1.0,而不是0.1。我经常要做的第一件事就是将清晰的颜色变成黄色或洋红色等令人讨厌的东西,并确保它清除整个事物。然后,我开始添加对象并确保它们位于正确的位置。 – user1118321 2012-03-07 17:32:22

回答

4

您不应该同时使用glFrustum和gluProjection。它们都是设置投影矩阵的操作,如果将它们一起使用,则会将它们相乘并得到奇怪的结果。通常,您只需将glFrustum gluProjection应用于单位矩阵,而不是二者。

如果这样不能解决问题,那么您的NEAR,FAR,WIDTH和HEIGHT值是什么? 还要确保你没有为你的屏幕比例(一个常见的错误)做整数除法。

+0

我的近值为1.0,远至1000.0,宽度为128,高度为256 – RobotRock 2012-03-07 18:14:44

+1

这确实是一个整数除以透视变量* rat *。感谢您的洞察! – RobotRock 2012-03-07 18:18:39