簡體   English   中英

OpenGL視錐體

[英]OpenGL frustum, perspective

我有以下將快照捕獲到幀緩沖區的代碼。 我驗證了幀緩沖區可以正常工作並且相機正確地面向對象。 我過去經常正確地完成圖片處理,但是它是基於錯誤的代碼,使用了錯誤的視錐程序。 所以我決定從頭開始(從平頭開始)。

對象位於中間,是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的值是多少? 另外,請確保您沒有針對屏幕比例進行整數除法(常見錯誤)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM