对角线OpenGL线丢失垂直分量?

时间:2013-09-20 01:40:58

标签: opengl

我尝试绘制对角线,但OpenGL将其显示为水平线,我不知道为什么。

这是我的代码:

设置OpenGL:

if (!SetWindowPixelFormat(hDC))
    return 0;

if (!CreateViewGLContext(hDC))
    return 0;


BOOL SetWindowPixelFormat(HDC hDC)
{
int iBPP = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);

ZeroMemory(&m_pfd, sizeof(PIXELFORMATDESCRIPTOR));

m_pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
m_pfd.nVersion = 1;
m_pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
m_pfd.iPixelType = PFD_TYPE_RGBA;
m_pfd.cColorBits = iBPP;
m_pfd.cDepthBits = 24;
m_pfd.iLayerType = PFD_MAIN_PLANE;

int pixelIdx = ChoosePixelFormat(hDC, &m_pfd);

if (pixelIdx <= 0)
    return FALSE;

if (!SetPixelFormat(hDC, pixelIdx, &m_pfd))
    return FALSE;

return TRUE;
}

设置截头数:

void OnSize(UINT nType, int cx, int cy)
{
    double fWidth = 35.209655761718750;
    double fHeight = 22.964477539062500;
    double xc = 506654.83659999998;
    double yc = 7805600.7220999999;

    SetFrustum(cx, cy, fWidth, fHeight, xc, yc);
}

void SetFrustum(int width, int height, double fWidth, double fHeight, double xc, double yc)
{    
glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluOrtho2D(xc - fWidth/2, xc + fWidth/2, yc - fHeight/2, yc + fHeight/2);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

以下5点必须在对角线上,但OpenGL显示为水平线:

void OnDraw(CDC* pDC)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);

glBegin(GL_POINTS);
    glVertex3d(506655.5111, 7805600.4781, 0);
    glVertex3d(506655.3184, 7805600.5478, 0);
    glVertex3d(506655.2220, 7805600.5827, 0);
    glVertex3d(506654.9330, 7805600.6872, 0);
    glVertex3d(506654.8366, 7805600.7221, 0);
glEnd();

glFlush();

SwapBuffers(pDC->m_hDC);
}

1 个答案:

答案 0 :(得分:1)

你在这里简单明了地遇到了精确问题。浮点值仅为近似值。你有一个固定数量的有效数字(尾数)和一个告诉数量级的指数。现在你在这里有两个非常不同的数量级:你的数字具有的绝对值的数量级(这是大数字)和这些数字变化的数量级(它们是小的)。如果你向它们抛出4次乘法和4次加法(当顶点分量通过矩阵乘法变换时会发生这种情况),你的非常小的值变化将在累积浮点运算的数值误差中丢失。在你的情况下,你的数字最终会变成相同的整数,但是如果你运气不好他们实际上会抖动。

如果你在这里使用单精度或双精度数学并不重要:要么GPU根本不支持双精度要么必须强制进入它,这通常涉及很多内部位杂耍来模拟它。当您使用GPU时,您实际上仅限于使用单精度。

现在我真的好奇为什么你的数字如此奇怪?你试图绘制的是什么,你有多大的数量级呢?