我想霧添加到一個小的3D世界,我試圖與參數擺弄OpenGL的霧化效果的變化,然而,霧是不均勻的。當我移動或旋轉的攝像頭
我有可能被掛了兩個問題:
霧均勻性:
當我移動或轉動我的gluLookAt觀點,霧氣太重,所有的世界是grey.However的是霧的渲染很好的兩個角度。 霧似乎正常當在Y軸的照相機orentation爲45°或-135°(相對的)霧居中於場景的原點:
當正確顯示我的霧,它的中心位於(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);
這聽起來非常不尋常 - 線性固定功能霧是簡單地眼空間深度的函數和霧範圍的(「和「」開始「」即「」結束」)的值。攝像機的方向不應影響霧感的密度 - 平移,當然會改變物體的外觀,但單獨旋轉不會改變與攝像機的距離。你可以添加一些屏幕截圖嗎? – thokra
你確定你在應用'gluLookAt(...)'而矩陣模式是'GL_MODELVIEW'嗎?霧是將觀察變換應用於PROJECTION矩陣實際上有所作爲的事情之一。通常,如果您使用的身份模型視圖矩陣你可以逃脫了將相機轉換到你的投影矩陣,而是事物(霧,頂點光照,透視紋理映射等),少數如果你這樣做是搞砸了。 –
我有同樣的問題,我使用序列大致是:'glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(...); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(...);'(這應該是好的,我認爲) – Vegard