Совершенно разные результаты рендеринга при разных режимах отображения? - PullRequest
0 голосов
/ 25 января 2011

У меня была эта проблема давным-давно, и недавно я получил некоторые подсказки, но все еще не очень ясно.

Я в основном рендерил текстуру в существующую фигуру, используя тестирование глубины.Функция отлично работает под видеокартой 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-глубины.

1 Ответ

0 голосов
/ 19 июля 2011

Я забыл вернуть свои решения по этому вопросу. Оказывается, это проблема аппаратного ускорения карты Intel. Я попытался отключить аппаратное ускорение, выбрав программный рендеринг, проблема исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...