A textura do Skybox não aparece com o OpenGL?

Então eu estou tendo esta tarefa que requer criar uma caixa de céu; a textura é fornecida como um único arquivo. Tenha em mente, Eu sou muito lento quando se trata de entender OpenGL, e esta caixa de céu em particular tem me deixado louco. Eu li sobre todas as pequenas coisas na internet que eu pensei que poderiam se relacionar com o meu problema, mas eu não posso compreender o que está acontecendo, que não é o que eu estou procurando desde que eu quero saber o que eu estou fazendo e não copiar/colar algum código, ou o resultado acaba sendo algo diferente.

o código relativo à caixa Celeste até agora:

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);
}

Textura de carga [parte do código em falta porque tenho texturas diferentes para outros elementos carregados aqui]:

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

Não tenho a certeza se é importante, mas também mencionarei que os outros elementos texturizados da cena não têm coordenadas de 0-1, mas de 100 a 1000. Eu tentei previamente configurar o textureCoordsSkyBox para 1000 em termos de coordenadas, mas ainda não resultado.

Imagino que faço algo completamente errado quando se trata da ligação da textura, mas estou a ter dificuldade em compreender como posso melhorar essa parte. Qualquer conselho seria profundamente apreciado. Obrigado antecipadamente.

- editar -

Então esta é a textura que estou a usar:

O que eu estou vendo é apenas preto, além dos outros elementos da cena, como a parede de trás, alguma grama e algumas flores. said textured elements of the scene]. Estou anexando o código aqui de qual parte do meu desenho a função cena se parece:

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();
}

Além disso, é a versão fixa do OpenGL. Tentei meter-me com ... GL_LIGHTING, GL_CULL_FACE, GL_DEPTH_TEST e glDisableClientState mas é o mesmo resultado. Além disso, não tenho erros.

Author: Rabbid76, 2019-01-03

1 answers

No teu caso, a caixa celeste é um objecto muito pequeno no centro do mundo. Tens de desenhar a caixa do céu na posição da Câmara. Quando você darw o sykbox, então você tem que desativar o teste de profundidade, isso faz com que o buffer de profundidade não é escrito e todas as outras partes da cena cobrir o skybox. Outras texturas bidimensionais têm de ser activadas por glEnable(GL_TEXTURE_2D), Antes de a geometria da caixa Celeste ser desenhada:
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
Author: Rabbid76, 2019-01-06 08:04:26