我尝试绘制对角线,但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);
}
答案 0 :(得分:1)
你在这里简单明了地遇到了精确问题。浮点值仅为近似值。你有一个固定数量的有效数字(尾数)和一个告诉数量级的指数。现在你在这里有两个非常不同的数量级:你的数字具有的绝对值的数量级(这是大数字)和这些数字变化的数量级(它们是小的)。如果你向它们抛出4次乘法和4次加法(当顶点分量通过矩阵乘法变换时会发生这种情况),你的非常小的值变化将在累积浮点运算的数值误差中丢失。在你的情况下,你的数字最终会变成相同的整数,但是如果你运气不好他们实际上会抖动。
如果你在这里使用单精度或双精度数学并不重要:要么GPU根本不支持双精度要么必须强制进入它,这通常涉及很多内部位杂耍来模拟它。当您使用GPU时,您实际上仅限于使用单精度。
现在我真的好奇为什么你的数字如此奇怪?你试图绘制的是什么,你有多大的数量级呢?