Question

I am currently rendering a skybox like so:

        //Front Face
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[0].getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(1f, 0.0f);
        GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z - offset);
        GL11.glTexCoord2f(1f, 1f);
        GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z - offset);
        GL11.glTexCoord2f(0.0f, 1f);
        GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z - offset);
        GL11.glTexCoord2f(0.0f, 0.0f);
        GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z - offset);
    GL11.glEnd();

    // Back Face
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[2].getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0.0f, 0.0f);
        GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z + offset);
        GL11.glTexCoord2f(1f, 0.0f);
        GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z + offset);
        GL11.glTexCoord2f(1f, 1f);
        GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z + offset);
        GL11.glTexCoord2f(0.0f, 1f);
        GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z + offset);
    GL11.glEnd();

    // Top Face
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[4].getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(1f, 1f);
        GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z - offset);
        GL11.glTexCoord2f(0.0f, 1f);
        GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z - offset);
        GL11.glTexCoord2f(0.0f, 0.0f);
        GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z + offset);
        GL11.glTexCoord2f(1f, 0.0f);
        GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z + offset);
    GL11.glEnd();

    // Bottom Face
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[5].getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(1f, 0f);
        GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z - offset);
        GL11.glTexCoord2f(1f, 1f);
        GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z + offset);
        GL11.glTexCoord2f(0f, 1f);
        GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z + offset);
        GL11.glTexCoord2f(0f, 0f);
        GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z - offset);
    GL11.glEnd();


    // Right face
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[3].getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0.0f, 0.0f);
        GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z - offset);
        GL11.glTexCoord2f(1f, 0.0f);
        GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z + offset);
        GL11.glTexCoord2f(1f, 1f);
        GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z + offset);
        GL11.glTexCoord2f(0.0f, 1f);
        GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z - offset);
    GL11.glEnd();

    // Left Face
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox[1].getTextureID());
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(1f, 0.0f);
        GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z - offset);
        GL11.glTexCoord2f(1f, 1f);
        GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z - offset);
        GL11.glTexCoord2f(0.0f, 1f);
        GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z + offset);
        GL11.glTexCoord2f(0.0f, 0.0f);
        GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z + offset);
    GL11.glEnd();

This seems like an extremely inefficient way of going about rendering a skybox because I have to keep switching between textures and quads. Additionally, rendering quads like this tends to attribute to visual artifacts like single pixel lines (seams between quads). I have heard of utilizing a cube map to make this more efficient, but am struggling with the implementation. If you guys have any suggestions, feel free to point me in the right direction. Thanks.

Était-ce utile?

La solution

A cube map is basically putting all the six textures on one texture. Then change your coordinates only once and use a glBindTexture once This would be something like:

GL11.glBindTexture(GL11.GL_TEXTURE_2D, skybox.getTextureID());
GL11.glBegin(GL11.GL_QUADS);
    //Front Face
    GL11.glTexCoord2f(0.25f, 0.25f);
    GL11.glVertex3f(-player.x - offset, -player.y - offset, -player.z - offset);
    GL11.glTexCoord2f(0.25f, 0.5f);
    GL11.glVertex3f(-player.x - offset, -player.y + offset, -player.z - offset);
    GL11.glTexCoord2f(0.0f, 0.5f);
    GL11.glVertex3f(-player.x + offset, -player.y + offset, -player.z - offset);
    GL11.glTexCoord2f(0.0f, 0.25f);
    GL11.glVertex3f(-player.x + offset, -player.y - offset, -player.z - offset);

    // Back Face
    ...
GL11.glEnd();

For more optimalisations consider disabling the depth buffer when rendering the skybox. You can also stop clearing the color bit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top