модели OpenGL не перекрываются правильно кросс-платформенный - PullRequest
1 голос
/ 21 февраля 2011

edit: я добавил несколько новых строк кода в начало для буферизации глубины без удачи.См. Код ..

edit 2: Я строю конструктор моделей на wxglcanvas с помощью wxwidgets.Я инициализировал WX_GL_DEPTH_SIZE из 16 и WX_GL_DOUBLEBUFFER поверх включения глубинной буферизации и glClear (GL_DEPTH_BUFFER_BIT) без удачи.Одна вещь, которая может быть полезной, чтобы отметить, - то, что, когда я рисую конус, он, кажется, рисует конус, как будто я смотрю на его внутреннюю часть, а не на внешнюю часть, поэтому он выглядит так, как будто он вогнутый.*

У меня странная проблема, когда мои модели openGL не перекрываются правильно.Я строю конструктор моделей, чтобы пользователь мог создавать и вращать модель на холсте.

Например: если у меня есть круг в рамке и я вращаю модель вокруг, я все еще могу видеть кругвнутри коробки, как будто коробка прозрачная.Я представляю, что если круг находится в рамке, я не смогу его увидеть.У кого-нибудь есть догадки о причинах такого рода проблем?Я не реализовал никакой прозрачности, поэтому я не совсем уверен, что является причиной этого.Я все еще новичок в openGL, поэтому многие мои усилия просто пробовали строки кода, которые я нашел на форумах, и надеялись, что это сработает.Кроме того, части этого кода наследуются от других программ.

Эта проблема, по-видимому, возникает только в Ubuntu, а не в Win 7, когда я тестирую свою программу после добавления двух строк кода (показано ниже).

Вот несколько строк кода для рисования моделей ...

//Newly Added code
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_GEQUAL);
      glClearDepth(1.0f);
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//End newly added code  

glGetIntegerv(GL_MATRIX_MODE, &mm);

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(identity);
       GrGetInfo();

glViewport(0,0,gw->gc.width,gw->gc.height);
       GrGetInfo();

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Set some predefined parameters

glOrtho ((GLdouble)tmpOtherAxis.minval, (GLdouble)tmpOtherAxis.maxval, 
               (GLdouble)tmpRangeAxis.minval, (GLdouble)tmpRangeAxis.maxval,  
               -range_dist, range_dist);
glMatrixMode(mm);

//ADDED THESE TWO LINES AND MODEL DISPLAYED
//CORRECTLY IN WIN7 BUT NOT UBUNTU
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();
//Draw model here
glPopMatrix();

Любая помощь будет принята с благодарностью, и не стесняйтесь задавать мне любые вопросы, касающиеся вас.

1 Ответ

3 голосов
/ 21 февраля 2011

Похоже, ваш z-буфер не включен.Без z-буфера геометрия просто рисуется в порядке выданных команд OpenGL.Эффективно, нет «позади».

Для правильной работы z-буфера вам необходимо:

  1. Запросить z-буфер для окна рендеринга.Это зависит от платформы.
  2. Вызовите glEnable (GL_DEPTH_TEST).
  3. Использовать glClear (... | GL_DEPTH_BUFFER_BIT);

Два возможных объяснения того, почему ваш код ведет себя по-разному на разных платформах: (а) z-буфер не выделен (должным образом) на одной из платформ или (б) состояние GL_DEPTH_TEST по умолчанию включенодля одной из платформ ВЫКЛ для другой.

Редактировать

В приложении Windows вы будете где-то использовать пару ChoosePixelFormat / SetPixelFormat на своем HDC, прямо перед использованием wglCreateContext().Здесь вы указываете свой буфер глубины.

            HDC hdc = GetDC(hwnd);

            PIXELFORMATDESCRIPTOR pfd;
            memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
            pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
            pfd.nVersion = 1;
            pfd.cColorBits = 16;
            pfd.cDepthBits = 16;  // <---- !!! Depth buffer !!!
            pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
            pfd.iPixelType = PFD_TYPE_RGBA;

            int format;
            if ((format = ChoosePixelFormat(hdc, &pfd)) != 0)
                    SetPixelFormat(hdc, format, &pfd);

            HGLRC hrc = wglCreateContext(hdc);
...