Question

I want to add fog to a small 3D world, I tried fiddling with the arguments, however, the fog is not homogeneous.

I have two problems that are maybe linked :

  1. Fog Homogeneity:
    When I move or rotate my viewpoint with gluLookAt, the fog is too heavy and all the world is grey.However the are two angles where the rendering of the fog is nice. The fog seems normal when the camera orentation on the Y axis is 45° or -135° (opposite)

  2. Fog centered on origin of the scene:

When my fog is correctly displayed, it is centered on the (0;0;0) of the scene

Here is the code I use to initialise the fog and the call to gluLookAt

private static final float density = 1f;

private void initFog() {
    float[] vertices = {0.8f, 0.8f, 0.8f, 1f};

    ByteBuffer temp = ByteBuffer.allocateDirect(16);
    temp.order(ByteOrder.nativeOrder());   
    FloatBuffer fogColor = temp.asFloatBuffer(); 
    fogColor.put(vertices);
    GL11.glClearColor(0.8f,0.8f,0.8f,1.0f); 
    GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
    GL11.glFog(GL11.GL_FOG_COLOR, temp.asFloatBuffer());
    GL11.glFogf(GL11.GL_FOG_DENSITY, density);
    GL11.glHint(GL11.GL_FOG_HINT, GL11.GL_FASTEST);
    GL11.glFogf(GL11.GL_FOG_START, 1f);
    GL11.glFogf(GL11.GL_FOG_END, 10000f);
}

private void initWindow() {
    try {
        Display.setDisplayMode(new DisplayMode(1600, 900));
        Display.create();
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GLU.gluPerspective(60f, 1600f / 900f, 3, 100000);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();
        GL11.glEnable(GL11.GL_FOG);
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        initFog();
        initParticles();
    } catch (LWJGLException e) {
        Display.destroy();
        System.exit(1);
    }
}

Called from the updatePosition function inside main loop The angle parameter is the direction of the viewport on y axis and yCpos is a value between -1 and 1 that I use to look up or down.

    GL11.glLoadIdentity();
    GLU.gluLookAt(xpos, ypos, zpos, xpos + (float)Math.cos(angle), ypos+ yCpos, zpos+ (float)Math.sin(angle), 0, 1, 0);
Was it helpful?

Solution

I was drawing the ground with one giant quad, and now I draw the ground with tiles, and the problem isn't happening any more. Therefore, the cause remains mysterious, but the problem is solved.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top