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