У меня была эта проблема давным-давно, и недавно я получил некоторые подсказки, но все еще не очень ясно.
Я в основном рендерил текстуру в существующую фигуру, используя тестирование глубины.Функция отлично работает под видеокартой nvdia, но не на видеокарте Intel (иногда изображение нестабильно, иногда просто джонки).
Сначала я думаю, что это может быть проблема с картой.Недавно я обнаружил, что если я изменил режим отображения в selectpixelformat, он также отлично работает на карте Intel.
Я также попробовал режим, выбранный функцией getpixelformat, и думаю, что это может быть связано с проблемой точности глубины,Я попробовал некоторые методы, рекомендованные в FAQ по opengl, но безуспешно.Я попробовал несколько режимов отображения RGBA, и они есть (используются только режимы с двойными буферами, и они 2,4,6,9,10, 13,14):
Draw Pixel Color Depth Stencil Double Stereo Aux
Index To Type Bits R G B A Bits Bits Buffer Buffer Buffers
======================================================================
2 win rgba 32 8 8 8 8 . . yes . .
4 win rgba 32 8 8 8 8 16 . yes . .
6 win rgba 32 8 8 8 8 24 8 yes . .
9 win rgba 32 8 8 8 . 32 8 yes . .
10 win rgba 32 8 8 8 . 16 8 yes . .
13 win rgba 32 8 8 8 8 32 8 yes . .
14 win rgba 32 8 8 8 8 16 8 yes . .
Режимы, которые отображаются правильно2, 9, 10, 13, 14. Неудачными являются 4, 6. Windows выбирает режим 4.
Кто-нибудь может дать мне несколько советов?
Спасибо за комментарии и здесьЯ добавляю плохую визуализацию и хорошую визуализацию изображения на той же машине.Один - это режим 4, а другой - режим 10:
извините!Система не позволяет мне вставлять изображение сюда
Вставленный здесь плохой - только один из них, некоторые могут показывать другие странные картинки.
Частичный код: инициализация OpenGL
m_pDC = new CClientDC(this);
//m_pDC = new CPaintDC(this);
m_hDC=m_pDC->GetSafeHdc();
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
16, // 16-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int m_PixelFormat;
//we may need to rewrite this function since it does not need the alpha bits
m_PixelFormat = ::ChoosePixelFormat(m_hDC, &pfd);
::SetPixelFormat(m_hDC, m_PixelFormat, &pfd);
//::SetPixelFormat(m_hDC, 10, &pfd);
//
m_hRC = ::wglCreateContext( m_hDC );
wglMakeCurrent( m_hDC, m_hRC );
wglMakeCurrent(NULL,NULL);
return TRUE;
Рендеринг в функции сообщения WM_PAINT: :: glEnable (GL_DEPTH_TEST);:: glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
::glViewport( 0, 0, rcClient.Width() , rcClient.Height() );
....
draw(...);
Функция рисования будет выглядеть следующим образом:
gluPerspective(90, width/height, 0.001, height/1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(cx,cy,cz,cx,cy,0,0,1,0);
затем нарисуйте карту здесь ...... glDisable (GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
затем нарисуйте линии и другие объекты здесь ...
все объекты представлены в формате 2D вершин, без значений 3D-глубины.