我有一个带有对象的3D场景,我想保存该对象的视图,该视图与我看到的当前屏幕的视图不同。 所以我想我只需做这样的事情(伪代码):
PushMatrix()
LoadIdentity()
TranslateAndRotate()
gluperspective()
setViewport()
DrawScene()
saveScreenshot()
PopMatrix()
但我只能得到我相机当前视图的图片,而不是我指定的图片。 我忘了什么吗?
编辑: 由于下面的答案,我尝试了以下代码:
void ScenePhotograph(GLubyte* Target, float *Translation, float RotationAroundY)
{
glMatrixMode(GL_PROJECTION);
gluPerspective(54.0f, (GLfloat)openGLControl1->Width / (GLfloat)openGLControl1->Height, 1.0f, 3000.0f);
glViewport(0,0,openGLControl1->Width, openGLControl1->Height);
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(Translation[0],Translation[1],Translation[2]);
glRotatef(RotationAroundY, 0,1,0);
openGLControl1_OnDrawGL(NULL,System::EventArgs::Empty);
openGLControl1->Refresh();
glReadPixels(0, 0, openGLControl1->Width, openGLControl1->Height, GL_RGB, GL_UNSIGNED_BYTE, Target);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
cam->SetView();
openGLControl1_OnDrawGL(NULL,System::EventArgs::Empty);
openGLControl1->Refresh();
glutSwapBuffers();
}
这给了我在glutSwapBuffers()的访问冲突; 任何想法?
答案 0 :(得分:2)
首先,确保您没有在代码中混合使用不同的矩阵。要获得屏幕截图,您需要完全按照通常的方式放置相机以在屏幕上查看它,但是,在交换缓冲区之前,您可以从当前帧缓冲区读取像素并将其存储为图像。
所以,你需要的是这样的东西:
glMatrixMode(GL_PROJECTION);
gluPerspective();
glMatrixMode(GL_MODELVIEW);
glClear(); // clear buffers here
loadIdendity();
setCameraPosition();
TranslateRotate();
DrawScene();
screenShot();
// do again to set your camera to correct position
glClear(); // clear buffers here
loadIdendity();
setCameraPosition();
TranslateRotate();
DrawScene();
swapBuffers();
如您所见,screenShot负责从当前帧缓冲区读取像素并将其另存为图像。所以再做一切将相机定位到正确的位置