Aryesia
Aryesia

Reputation: 162

Skybox textures is transparent

My skybox is displayed, but does not display the textures that I load from the image. Instead, it shows the transparent color if i set glTexImage2D how GL_RGBA, or black color if i set glTexImage2D how GL_RGB.

I am using a render with MultisampledFbo support.

My texture loading code looks like this:

private int loadSkyboxTextures(){
         glGenBuffers(vbo);
         glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
         glBufferData(GL_ARRAY_BUFFER, POINTS, GL_STATIC_DRAW);
         glBindBuffer (GL_ARRAY_BUFFER, 0);
         glGenVertexArrays(vao);
         glBindVertexArray(vao[0]);
         glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
         glVertexPointer(3, GL_FLOAT, 3 * Float.BYTES, NULL);
         glTexCoordPointer (3, GL_FLOAT, 3 * Float.BYTES, NULL);        
         glBindBuffer (GL_ARRAY_BUFFER, 0);
         glEnableClientState(GL_VERTEX_ARRAY);
         glEnableClientState(GL_TEXTURE_COORD_ARRAY);

        int texID = glGenTextures();
        glBindTexture(GL_TEXTURE_CUBE_MAP, texID);
        for(int i = 0; i < TEXTURE_FILES.length; i++){
            InputStream file = getClass().getResourceAsStream(TEXTURE_FILES[i]);
            byte[] pixelData = new byte[0];
            try {
                pixelData = new byte[file.available()];
                file.read(pixelData);
            } catch (IOException e) {
                e.printStackTrace();
            }
            ByteBuffer byteBuffer = ByteBuffer.wrap(pixelData);
            glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 512, 512, 0,
                    GL_RGB, GL_UNSIGNED_BYTE, byteBuffer);
        }

        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

        return texID;
    }

Cube Render Code:

    private void drawSkybox(){
        glColor4f(1,1,1,1);
        glDepthMask(false);
        glEnable(GL_TEXTURE_CUBE_MAP);
        glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
        glBindVertexArray(vao[0]);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_CUBE_MAP, texId);
        glDrawArrays(GL_TRIANGLES, 0, 36);
        glBindVertexArray(0);
        glBindBuffer (GL_ARRAY_BUFFER, 0);
        glDepthMask(true);
        glDisable(GL_TEXTURE_CUBE_MAP);
    }

The cube rendering call in the main render function:

                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                view = viewX || viewY || viewZ;
                if(view)
                    glPushMatrix();

                int rot = 180;

                glDisable(GL_LIGHTING);
                glViewport(0, 0, WIDTH, HEIGHT);
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                glOrtho(-max, max, -1, 1, 10, -10);
                glRotated(cameraX, 1f, 0f, 0);
                glRotated(cameraY, 0f, 1f, 0);
                glMatrixMode(GL_MODELVIEW);
                glLoadIdentity();
                drawSkybox(texId);

                glViewport(0, 0, WIDTH, HEIGHT);
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                ...
                //render camera and other objects

Upvotes: 0

Views: 229

Answers (1)

Rabbid76
Rabbid76

Reputation: 210878

For cube map textures, the texture coordinates are 3-dimensional and treated as a vector form the center of the cube map.
Since you draw a cube, which is centered around (0, 0, 0), you can use the the vertex coordinates for the texture coordinates, too. You do not use a shader program, so you have to use fixed function attributes. Specify the vertex coordinates by glVertexPointer and the texture coordinates by glTexCoordPointer. Enable the client-side capability (glEnableClientState) GL_VERTEX_ARRAY and GL_TEXTURE_COORD_ARRAY.

Specify the Vertex Array Object. It is sufficient to execute that code once at intialization:

glGenBuffers(vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, POINTS, GL_STATIC_DRAW);
glBindBuffer (GL_ARRAY_BUFFER, 0);

glGenVertexArrays(vao);
glBindVertexArray(vao[0]);

glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
glVertexPointer(3, GL_FLOAT, false, 3 * Float.BYTES, NULL);
glTexCoordPointer (3, GL_FLOAT, false, 3 * Float.BYTES, NULL);
glBindBuffer (GL_ARRAY_BUFFER, 0);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glBindVertexArray(0);

When you draw the skybox it is sufficient to bind the cubemap texture to enable cube-mapped texturing and to bind the VAO:

private void drawSkybox(){
    GL11.glColor4f(1,1,1,1);
    glDepthMask(false);        

    glEnable(GL_TEXTURE_CUBE_MAP);
    glBindTexture(GL_TEXTURE_CUBE_MAP, texID);

    glBindVertexArray(vao[0]);
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glBindVertexArray(0);

    glDepthMask(true);
    glDisable(GL_TEXTURE_CUBE_MAP);
}

There are some further issues:

Upvotes: 0

Related Questions