2013-01-16 206 views
0

我目前渲染天空盒,像这样的更有效的方法:LWJGL:渲染天空盒

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

这似乎是要去约渲染天空盒极其低效的方式,因为我要保持纹理之间切换四边形。此外,像这样渲染四边形往往归因于像单个像素线(四边形之间的接缝)的视觉伪像。我听说利用立方体贴图来提高效率,但我正在努力实现。如果你们有任何建议,请随时指出我的方向。谢谢。

回答

2

立方体贴图基本上将所有六个贴图放在一个贴图上。然后改变你的坐标,只有一次,使用glBindTexture一旦这会是这样的:

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

对于渲染天空盒时更optimalisations考虑禁用深度缓冲。您也可以停止清除颜色位。