Текстура скайбокса не показывается с OpenGL?

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

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

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

Так что это текстура, которую я использую:

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

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

Решение

В вашем случае скайбокс — очень маленький объект в центре мира.
Вы должны нарисовать скайбокс в положении камеры. Когда вы рисуете 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]