Текстура Skybox не отображается с OpenGL? - PullRequest
0 голосов
/ 04 января 2019

Итак, у меня есть это задание, которое требует создания скайбокса; текстура предоставляется в виде одного файла. Имейте в виду, я очень медленно разбираюсь в OpenGL, и именно этот SkyBox сводит меня с ума. Я читаю каждую мелочь в интернете, которая, как мне казалось, может касаться моей проблемы, но я либо не могу понять, что происходит, но это не то, чем я занимаюсь, поскольку хочу знать, что я делаю, а не копировать / вставьте некоторый код, или результат окажется чем-то другим.

Код, относящийся к скайбоксу:

GLfloat cubeVertexData[108] =
{
    0.5f, -0.5f, -0.5f,
    0.5f, 0.5f, -0.5f,
    0.5f, -0.5f, 0.5f,
    0.5f, -0.5f, 0.5f,
    0.5f, 0.5f, -0.5f,
    0.5f, 0.5f, 0.5f,

    0.5f, 0.5f, -0.5f,
    -0.5f, 0.5f, -0.5f,
    0.5f, 0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
    -0.5f, 0.5f, -0.5f,
    -0.5f, 0.5f, 0.5f,

    -0.5f, 0.5f, -0.5f,
    -0.5f, -0.5f, -0.5f,
    -0.5f, 0.5f, 0.5f,
    -0.5f, 0.5f, 0.5f,
    -0.5f, -0.5f, -0.5f,
    -0.5f, -0.5f, 0.5f,
    //4
    -0.5f, -0.5f, -0.5f,
    0.5f, -0.5f, -0.5f,
    -0.5f, -0.5f, 0.5f,
    -0.5f, -0.5f, 0.5f,
    0.5f, -0.5f, -0.5f,
    0.5f, -0.5f, 0.5f,
    //5
    0.5f, 0.5f, 0.5f,
    -0.5f, 0.5f, 0.5f,
    0.5f, -0.5f, 0.5f,
    0.5f, -0.5f, 0.5f,
    -0.5f, 0.5f, 0.5f,
    -0.5f, -0.5f, 0.5f,
    //6
    0.5f, -0.5f, -0.5f,
    -0.5f, -0.5f, -0.5f,
    0.5f, 0.5f, -0.5f,
    0.5f, 0.5f, -0.5f,
    -0.5f, -0.5f, -0.5f,
    -0.5f, 0.5f, -0.5f
};

GLfloat textureCoordsSkyBox[72] = {
    //face 1
    0.75,0.33,      //    0,1,
    0.75,0.67,     //    1,1,
    0.5,0.33,     //    0,0,
    0.5,0.33,     //    0,0,
    0.75,0.67,    //    1,0,
    0.5,0.67,   //    1,1,

    //face 2
    0.5,1.0, //    1,1,
    0.25,1, //    0,1,
    0.5,0.67, //    1,0,
    0.5,0.67, //    1,0,
    0.25,1.0, //    0,1,
    0.25,0.67, //    1,1,
    //face 3
    0,0.67,//    1,1,
    0,0.33,//    0,1,
    0.25,0.67,//    1,0,
    0.25,0.67,//    1,0,
    0,0.33,//    0,1,
    0.25,0.33,//    0,0,
    //face 4
    0.25,0.0,//    0,1,
    0.5,0.0,//    1,1,
    0.25,0.33,//    0,0,
    0.25,0.33,//    0,0,
    0.5,0.0,//    1,1,
    0.5,0.33,//    0,0,
    //face 5
    0.5,0.67,//    1,0,
    0.25,0.67,//    0,0,
    0.5,0.33,//    1,1,
    0.5,0.33,//    1,1,
    0.25,0.67,//    0,0,
    0.25,0.33,//    0,1,
    //face 6
    0.75,0.33,//    1,1,
    1.0,0.33,//    0,1,
    0.75,0.67,//    1,0,
    0.75,0.67,//    1,0,
    1.0,0.33,//    0,1,
    1.0,0.67//    0,0
};

GLfloat gCubeVertexdataNormals[108] =
{
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,

    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,

    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,

    0.0f, -1.0f, 0.0f,
    0.0f, -1.0f, 0.0f,
    0.0f, -1.0f, 0.0f,
    0.0f, -1.0f, 0.0f,
    0.0f, -1.0f, 0.0f,
    0.0f, -1.0f, 0.0f,

    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,

    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f
};

void DrawSkyBox() {
    glFrontFace(GL_CW); 

    glBindTexture(GL_TEXTURE_2D, textures[SKYIMAGE]);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, 0, gCubeVertexdataNormals);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, cubeVertexData);

    glTexCoordPointer(2, GL_FLOAT, 0, textureCoordsSkyBox);

    glDrawArrays(GL_TRIANGLES, 0, 36);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

Загрузка текстуры [часть кода отсутствует, так как здесь загружены различные текстуры для других элементов]:

.....
#define SKYIMAGE 5 //sky image 
const char *textureFiles[TEXTURE_COUNT] = { "stormydays.tga".... };

Я не уверен, что это важно, но я также упомяну, что другие текстурированные элементы сцены имеют координаты не от 0-1, а от 100 до 1000. Ранее я пытался настроить textureCoordsSkyBox до 1000 с точки зрения координат, но все еще нет результата.

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

-Edit-

Итак, вот текстура, которую я использую:

То, что я вижу, просто черное, помимо других элементов сцены, таких как задняя стена, немного травы и цветов [это то, что я имел в виду, когда говорил текстурированные элементы сцены]. Здесь я прилагаю код того, как часть моего рисунка выглядит как функция сцены:

void RenderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);

    gluLookAt(cameraX, cameraY, cameraZ,//eye
    50.00, 90.00, 50.00,//centre
    0.00, 1000.00, 0.00);//up

    glPushMatrix();

    DrawSkyBox();

    glPopMatrix();
    glPushMatrix();
    glTranslatef(0.0, 0.0, -100.0);
    glRotatef(-90.0, 1.0, 0.0, 0.0);

    drawTexturedSurface(IMAGE1); //grass

    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.0, 0.0, -350.0);

    drawTexturedSurface(IMAGE4); //front stone wall

    glPopMatrix();
    glPushMatrix();
    .......
    glPopMatrix();

    drawGUI();
    glPushMatrix();

    glutSwapBuffers();
}

Кроме того, это исправленная версия OpenGL. Я попытался возиться с GL_LIGHTING, GL_CULL_FACE, GL_DEPTH_TEST и glDisableClientState, но это тот же результат. Также я не получаю никаких ошибок.

1 Ответ

0 голосов
/ 04 января 2019

В вашем случае скайбокс - это очень маленький объект в центре мира.Вы должны нарисовать скайбокс в положении камеры.Когда вы рисуете sykbox, вы должны отключить тест глубины, это потому, что буфер глубины не записан, а все остальные части сцены покрывают скайбокс.Дальнейшее двумерное текстурирование должно быть включено с помощью glEnable(GL_TEXTURE_2D), прежде чем начертится геометрия скайбокса:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);

gluLookAt(
    cameraX, cameraY, cameraZ,//eye
    50.00, 90.00, 50.00,//centre
    0.00, 1000.00, 0.00);//up

glDisable(GL_DEPTH_TEST);
glPushMatrix();   
glTranslatef(cameraX, cameraY, cameraZ); // model transformation to the camera position
glEnable(GL_TEXTURE_2D);
DrawSkyBox();
glPopMatrix();
glEnable(GL_DEPTH_TEST);
...