2012-03-07 3 views
0

私はフレームバッファにスナップショットをとる次のコードを持っています。フレームバッファが正しく動作し、カメラがオブジェクトに正しく向き合っていることを確認しました。私は正しく写真を撮っていましたが、間違った錐台を使って、間違ったコードに基づいていました。だから私は新鮮な(錐台で)始めることにしました。OpenGL frustum、perspective

目的は、中央を中心と各ブロック2×2 32×32ブロックであるので、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(); 
} 

EDIT:glFrustumまたはglPerspectiveのみを使用してみました。運がない。

+2

なぜあなたは 'glFrustum()'と 'gluPerspective()'の両方を呼び出していますか?彼らは同じことをする。おそらくそれらのうちの1つを削除するべきです。 (私は同じミスを犯しました!)あなたの近くのクリッピングプレーンは、1.0ではなく0.1です。私がいつも試してやることの最初のことは、クリアカラーを黄色やマゼンタのような不快なものに変更し、それが全体をクリアしていることを確認することです。次に、オブジェクトを追加し、それらが正しい場所にいることを確認します。 – user1118321

答えて

4

glFrustumとgluProjectionの両方を使用しないでください。それらはどちらも投影行列を設定する操作です。それらを一緒に使用すると、それらを掛け合わせて奇妙な結果が得られます。一般的に、glFrustum OR gluProjectionを単位行列に適用するだけで、両方ではできません。

これで問題が解決しない場合は、NEAR、FAR、WIDTH、およびHEIGHTの値はどうなりますか? スクリーンレシオの整数除算を行わないようにしてください(一般的なバグ)。

+0

nearの私の値は1.0、遠い1000.0、幅は128、高さは256です – RobotRock

+1

これは確かにperspective変数* rat *で整数除算でした。洞察に感謝します! – RobotRock

関連する問題