سؤال

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.

هل كانت مفيدة؟

المحلول

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top