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

ここでは、単純かつ明確に精度の問題に直面しています。浮動小数点値は概算です。有効桁数 (仮数) の固定数と、桁数を示す指数が得られます。これで、2 つの非常に異なる桁数が得られました。数値の絶対値の桁数 (大きいほう) と、それらの数値が変化する桁 (小さいほう) です。それらに 4 つの乗算と 4 つの加算を行うと (これは頂点コンポーネントが行列乗算によって変換されるときに発生します)、非常に小さい値の変動は、浮動小数点演算を実行して蓄積される数値エラー内で失われます。あなたの場合、数値は最終的に同じ整数に丸められますが、運が悪いと実際に揺れます。

ここで単精度演算を使用するか倍精度演算を使用するかは問題ではありません。GPU が倍精度をまったくサポートしていないか、強制的に倍精度にする必要があります。これには、通常、エミュレートするために多くの内部ビット ジャグリングが必要です。GPU を使用している場合、事実上、単精度での作業に制限されます。

なぜあなたの数字がそんなに奇数なのだろうか?あなたが描こうとしているものは何ですか?

于 2013-09-20T10:31:51.500 に答える