2014-02-27 25 views
2

我想霧添加到一個小的3D世界,我試圖與參數擺弄OpenGL的霧化效果的變化,然而,霧是不均勻的。當我移動或旋轉的攝像頭

我有可能被掛了兩個問題:

  1. 霧均勻性:
    當我移動或轉動我的gluLookAt觀點,霧氣太重,所有的世界是grey.However的是霧的渲染很好的兩個角度。 霧似乎正常當在Y軸的照相機orentation爲45°或-135°(相對的)

  2. 霧居中於場景的原點:

當正確顯示我的霧,它的中心位於(0; 0; 0)場景

這裏是我使用初始化霧和調用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); 
    } 
} 

的Ca的代碼從主循環 角度參數的內部,updatePosition功能LLED是在Y軸上,並yCpos視口的方向上,我使用向上或向下看-1和1之間的值。

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

這聽起來非常不尋常 - 線性固定功能霧是簡單地眼空間深度的函數和霧範圍的(「和「」開始「」即「」結束」)的值。攝像機的方向不應影響霧感的密度 - 平移,當然會改變物體的外觀,但單獨旋轉不會改變與攝像機的距離。你可以添加一些屏幕截圖嗎? – thokra

+0

你確定你在應用'gluLookAt(...)'而矩陣模式是'GL_MODELVIEW'嗎?霧是將觀察變換應用於PROJECTION矩陣實際上有所作爲的事情之一。通常,如果您使用的身份模型視圖矩陣你可以逃脫了將相機轉換到你的投影矩陣,而是事物(霧,頂點光照,透視紋理映射等),少數如果你這樣做是搞砸了。 –

+0

我有同樣的問題,我使用序列大致是:'glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(...); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(...);'(這應該是好的,我認爲) – Vegard

回答

1

我與一個巨大的四繪製地面,現在我用的瓷磚畫在地上,這個問題是不會發生了。因此,原因仍然很神祕,但問題解決了。

+0

我*想*我知道這是爲什麼發生。這似乎與相機背後的頂點有關。也許單個大四邊形/三角形(或其頂點之一)正在被剪裁,因此擰上霧計算中使用的深度插值。 – Vegard

+1

我一直在努力解決這個問題。這確實是使用單個巨型四邊形的問題,因爲從視角來看,它的所有頂點都是不可見的。更糟的是,問題是顯卡和驅動程序依賴。使用我的nvidia卡,在ubuntu下,我有使用免費的nouveau驅動程序的問題。但如果我改用專制司機,問題就沒有了。 **只使用4巨頭股四頭肌,使每一個有在中心一個頂點,徹底解決了這一問題。**這似乎與任何驅動程序的工作。 – LGenzelis

+0

@LGenzelis,這正是我的情況,與OP面臨的同樣的問題。我有一臺帶集成英特爾處理器和NVidia卡的筆記本電腦。使用英特爾處理器運行該程序,我迷上了攝像頭問題。使用NVidia卡運行它,霧效果和預期一樣。 – fegemo