OpenGL在特定条件下的崩溃--浮点协处理器异常
OpenGL在特定条件下的崩溃--浮点协处理器异常
程序源代码下载
http://alphasun.icpcn.com/alphasun/download/rubber-banding-OpenGL.rar
崩溃条件
1、调用 gluLookAt
2、_control87(851971, -1); 告诉浮点协处理器 遇到 异常 要报告
3、启用 glEnable(GL_COLOR_LOGIC_OP);
4、画点
glBegin(GL_POINTS);
glVertex3d(0,0,0);
glEnd();
在第四步就会崩溃。不同的机器上可能出现不同类型的 exception。大致种类如下:
1、float devide by zero
2、float overflow
3、float invalid operation
程序源代码下载
http://alphasun.icpcn.com/alphasun/download/rubber-banding-OpenGL.rar
源代码片段
// EXCEPTION AG 2004
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
///################################
gluLookAt(m_pntViewer.x,
m_pntViewer.y,
m_pntViewer.z,
m_pntTarget.x,
m_pntTarget.y,
m_pntTarget.z,
m_vUp.x,
m_vUp.y,
m_vUp.z);
int old = _control87(0, 0);
old = _CW_DEFAULT;
_control87(851971, -1);
//####################################################
//
glEnable(GL_COLOR_LOGIC_OP);
glDisable(GL_COLOR_LOGIC_OP);
glLogicOp(GL_XOR);
glBegin(GL_POINTS);
glVertex3d(0,0,0);
glEnd();
glDisable(GL_COLOR_LOGIC_OP);
//####################################################
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%