OpenGL куб не рендерится должным образом - PullRequest
3 голосов
/ 13 февраля 2012

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

Проблема заключается в том, что при рендеринге сцены предполагается, что проволочный кубнаходиться перед другим сплошным кубом, он не отображается правильно.

enter image description here

На изображении выше цветной куб должен находиться позади проволочного куба.т.е. зеленый проводной куб должен быть сверху.

Также куб не работает должным образом.

enter image description here

После того, как я немного поверну его вокруг оси x (текущая горизонтальная линия).

У куба отсутствуют грани, и он неправильно рендерится.Что я делаю не так?

Я кодировал следующее примечание: rotateX, rotateY, rotateZ отображаются на ключи и являются моими глобальными переменными вращения.

//The Initialize function, called once:    
void Init(){
    glEnable(GL_TEXTURE_2D); 
    glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // Black Background
    glClearDepth(1.0f);                                 // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);                            // Depth Buffer Setup                       // Enables Depth Testing
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
    glEnable(GL_LIGHTING);
}

void draw(){
    //The main draw function
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective(45, 640/480.0, .5, 100);

    glMatrixMode(GL_MODELVIEW); //select the modelview matrix.
    glLoadIdentity ();
    gluLookAt(0,0,5,
              0,0,0,
              0,1,0);    

    glRotatef(rotateX,1,0,0);
    glRotatef(rotateY,0,1,0);
    glRotatef(rotateZ,0,0,1);
    drawScene();  // this just draws the main axis lines,

    glutWireCube(1);  

    glPopMatrix();
    glPushMatrix();
    glTranslatef(-2,1,0);
    drawNiceCube();
    glPopMatrix();

    glutSwapBuffers();
}

Код для drawNiceCube() просто использует GL_QUADS, в то время как drawWireCube встроен в GLUT.

РЕДАКТИРОВАТЬ: Я разместил полный код на http://pastebin.com/p1kwPjEM, извините, если он не задокументирован.

Ответы [ 3 ]

4 голосов
/ 13 февраля 2012

Вы также запрашивали окно с буфером глубины?

glutInitDisplayMode( ... | GLUT_DEPTH | ...);

Обновление:

Вы где-нибудь включили отбор лица?

glEnable(GL_CULL_FACE);
1 голос
/ 13 февраля 2012

Это может быть причиной по часовой стрелке

10.090 Как работает отбраковка лица? Почему не используется нормальная поверхность?

При отборе граней OpenGL вычисляется область со знаком заполненного примитива в координатном пространстве окна. Зона со знаком положительна, когда координаты окна расположены против часовой стрелки, и отрицательна, когда по часовой стрелке. Приложение может использовать glFrontFace (), чтобы указать порядок, против часовой стрелки или по часовой стрелке, который будет интерпретироваться как примитив, обращенный вперед или назад. Приложение может указать отбраковку передней или задней граней, вызвав glCullFace (). Наконец, выбор лица должен быть включен с помощью вызова glEnable (GL_CULL_FACE); .

OpenGL использует проекцию пространства окна вашего примитива, чтобы определить выборку лица по двум причинам. Для создания интересных световых эффектов часто желательно указывать нормали, которые не ортогональны аппроксимируемой поверхности. Если эти нормали использовались для отбора лиц, это может привести к ошибочной отбраковке некоторых примитивов. Кроме того, для схемы отбора точечного произведения может потребоваться инверсия матрицы, что не всегда возможно (т. Е. В случае, когда матрица является единственной), тогда как область со знаком в пространстве DC всегда определяется.

Однако некоторые реализации OpenGL поддерживают расширение GL_EXT_ cull_vertex. Если это расширение присутствует, приложение может указать однородное положение глаз в пространстве объектов. Вершины помечены как отбракованные, основываясь на точечном произведении текущей нормали с вектором из вершины в глаз. Если все вершины примитива отбракованы, примитив не отображается. Во многих случаях, используя это расширение

с здесь

Также вы можете прочитать здесь

0 голосов
/ 16 февраля 2012

datenwolf решил мою проблему. Я цитирую его:

"@ JonathanSimbahan: части вашего кода избыточны, но чего-то не хватает: вы забыли вызвать Init (); после создания окна GLUT, следовательно, тестирование глубины и все остальные состояния никогда не включаются. Я, например, предлагаю вам вообще не используйте Init и перемещайте его код в код рисования, где он на самом деле принадлежит. "

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