0

我尝试绘制对角线,但 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);
}
4

1 回答 1

1

您在这里简单而明显地遇到了精度问题。浮点值只是近似值。你有一个固定数量的有效数字(尾数)和一个说明数量级的指数。现在您在这里有两个非常不同的数量级:您的数字具有的绝对值的数量级(较大)和这些数字变化的数量级(较小)。如果您将 4 次乘法和 4 次加法扔到它们上(当顶点组件通过矩阵乘法转换时会发生这种情况),您非常小的值变化将在累积执行浮点运算的数值错误中丢失。在您的情况下,您的数字最终会四舍五入到相同的整数,但是如果您不走运,它们实际上会抖动。

在这里使用单精度还是双精度数学并不重要:GPU 根本不支持双精度,或者必须强制使用双精度,这通常涉及大量内部位杂耍来模拟它。当您使用 GPU 时,您实际上仅限于使用单精度。

现在我真的想知道为什么你的数字这么奇怪?你试图画的是什么,你有这么大的数量级范围?

于 2013-09-20T10:31:51.500 回答