我有以下将快照捕获到帧缓冲区的代码。我验证了帧缓冲区可以正常工作并且相机正确地面向对象。我过去经常正确完成图片处理,但是它是基于错误的代码,使用了错误的视锥程序。所以我决定从头开始(从平头开始)。

对象位于中间,是32 * 32块,每个块2 * 2,所以64 * 64。

我的距离是100,视口是128x256。我的视锥范围是1到1000.0。

我是Opengl的新手,所以我很难完全理解平截头概念和观点。

我根本没有照片。

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和gluProjection。它们都是设置投影矩阵的操作,如果一起使用它们,则将它们相乘会得到奇怪的结果。通常,您只将glFrustum或gluProjection应用于单位矩阵,而不要同时应用于两者。

如果那不能解决问题,那么您的NEAR,FAR,WIDTH和HEIGHT的值是多少?
另外,请确保您没有针对屏幕比例进行整数除法(常见错误)。

关于c++ - OpenGL视锥体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9606160/

10-11 18:23