OpenGL Skybox неправильно отображает стороны - PullRequest
2 голосов
/ 12 сентября 2011

Я довольно новичок в OpenGL и столкнулся с проблемой при попытке рендерить скайбокс. Эта картина довольно хорошо иллюстрирует проблему.

Стороны скайбокса не отображаются, и когда я вижу край (как на картинке), это просто выглядит так, как будто изображения отображаются рядом друг с другом, а не как разные стороны куба.

void display ( void )   // Create The Display Function
{
glPushMatrix();
glDepthMask(0);
/* replace this code with your height field implementation */
/* you may also want to precede it with your rotation/translation/scaling */
/* Clear buffers */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt( 0.0, 0.0, 0.0,  // eye position
           0.1, 0.0, 0.1,  // camera direction
           0.0, 1.0, 0.0); // up direction

glPushAttrib(GL_ENABLE_BIT);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);

glColor4f(1.0, 1.0, 1.0, 1.0);

/*!!!!!!!!!!!!!! FRONT FACE !!!!!!!!!!!!!!!*/

glBindTexture(GL_TEXTURE_2D,frontTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(  0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 0); glVertex3f( -0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 1); glVertex3f( -0.5f, -0.5f, -0.5f );
    glTexCoord2f(0, 1); glVertex3f(  0.5f, -0.5f, -0.5f );
glEnd();

/*!!!!!!!!!!!!!! LEFT FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, leftTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f, -0.5f );
    glTexCoord2f(0, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
glEnd();

/*!!!!!!!!!!!!!! RIGHT FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, rightTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
    glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f, -0.5f );
glEnd();

/*!!!!!!!!!!!!!! BACK FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, backTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
    glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );

glEnd();

/*!!!!!!!!!!!!!! TOP FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, upTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
    glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
glEnd();

/*!!!!!!!!!!!!!! BOTTOM FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, downTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
    glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
glEnd();

/*!!!!!!!!!!!!!! end of drawing of a textured quad !!!!!!!!!!!!!!!*/
glPopAttrib();
glPopMatrix();

/* Swap buffers, so one we just drew is displayed */
glutSwapBuffers();
}

Я чувствую, что мне здесь чего-то не хватает, но я не уверен, что именно. Код более или менее дословно с учебного сайта (http://sidvind.com/wiki/Skybox_tutorial). Код был скомпилирован с g ++ 4.5.2 на Ubuntu Linux, но та же проблема возникает в визуальная студия.

Я должен также заявить, что числа, использованные в приведенном выше коде, являются значениями, которые произвел связанную картинку.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Ваши текстуры должны образовывать бесшовное соединение по краям куба. На предоставленном вами снимке экрана эти изображения не образуют бесшовного соединения (посмотрите на небо).

Также проверьте матрицу проекции - настраиваете ли вы перспективное преобразование?

Чтобы настроить перспективную проекцию (наиболее распространенную для 3D-приложений):

glMatrixMode(GL_PROJECTION);  // switch to projection matrix
glLoadIdentity();  // reset projection
gluPerspective(90.0,4.0/3.0,0.01,10.0);   // 90deg FOV, 4:3 aspect ratio, 0.01 near clip plane, 10.0 far clip plane
glMatrixMode(GL_MODELVIEW);  // back to model matrix
1 голос
/ 12 сентября 2011

Мне кажется, что текстура справа должна быть слева от левого изображения.Так что я предполагаю, что вы текстурируете не те стороны куба.

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