2011-10-21 26 views
0

好吧,我製作了一個「天空盒」(它實際上是5平面,因爲不同的紋理)。它工作正常,但閃電有問題。這不是我在OpenGL中最強烈的一點,所以如果答案不那麼難,我不會感到驚訝。Android OpenGL天空盒燈不真正工作

這就是我的起始位置視圖。正如你所看到的,前面的飛機很明亮,但是左邊,上邊,右邊並不是真的,它們和前面之間有邊界。

http://img696.imageshack.us/img696/3673/light01.png

當我去到天空盒的絕對中心(接近),那麼邊界不那麼明顯(我猜的絕對中心,沒有邊界。

http://img233.imageshack.us/img233/2949/light02.png

首先,我嘗試用這些設置在位置(0,0,0)處使用一盞燈,但沒有任何結果,我試圖改變環境,漫反射,但沒有真正的幫助:

private float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1.0f}; 
    private float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f}; 
    private float[] lightPosition = {0.0f, 0.0f, 0.0f, 1.0f}; 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
      gl.glEnable(GL10.GL_DITHER); 
      gl.glEnable(GL10.GL_TEXTURE_2D); 
      gl.glShadeModel(GL10.GL_SMOOTH); 
      gl.glClearColor(0, 0, 0, 0); 

      gl.glClearDepthf(1.0f); 
      gl.glEnable(GL10.GL_DEPTH_TEST); 
      gl.glDepthFunc(GL10.GL_LEQUAL); 
      gl.glEnable(GL10.GL_LIGHT0); 
      gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
      gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer); 
      gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer); 
      gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer); 
    } 

    public void onDrawFrame(GL10 gl) { 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
      gl.glLoadIdentity(); 
      gl.glEnable(GL10.GL_LIGHTING); 

      GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, 0.0f, 1.0f, 0.0f); 
    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 
      if(height == 0) { 
       height = 1;       
      } 

      gl.glViewport(0, 0, width, height); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      GLU.gluPerspective(gl, 65.0f, (float)width/(float)height, 1.0f, 80.0f); 
      gl.glMatrixMode(GL10.GL_MODELVIEW); 
      gl.glLoadIdentity(); 
    } 

所以問題是我怎樣才能使這個工作在我所在的每個地方。我希望有人能幫助我,因爲現在看起來不太好(沒有光線很好,但我並不是真的想要夜景,特別是有太陽的紋理)。

EDIT(它是如何工作現在):因爲它是在回答有對天空盒沒有法線了,但我已經啓用閃電後,我需要添加此行的代碼,而現在它的工作原理像一個魅力,天空隨處可見。

gl.glLightModelf(GL10.GL_LIGHT_MODEL_TWO_SIDE, GL10.GL_TRUE); 
+0

你爲什麼不在球體內創造你的世界?如果爲球體中的每個頂點定義了正確的法線,這將消除整個照明問題。 – Wroclai

+0

嗯。這其實並不是一個壞主意,也許如果明天才會有真正的答案,那麼我會試試看。問題是,我真的不知道如何創建一個球體。 (也許我在Blender做了一個,並以某種方式導入它,因爲手動我真的不知道人怎麼能做到這一點。) – matthew3r

+0

有一些手動方法來實現這一點(有些工作)。看看這個:http://www.swiftless.com/tutorials/opengl/sphere.html – Wroclai

回答

2

答案確實不那麼難;你根本不應該在你的天空盒上使用照明。

+0

謝謝,現在很好,但還有一個問題。現在,前方的天空真的很黑,但是當我離開它時,背面會變得更加明亮,朝向前方。在左側和右側,光線是漸變的。它們與背部連接的位置與背板一樣明亮,但與前部連接的位置則是黑暗的。我真的不明白髮生了什麼:) – matthew3r

+0

我編輯了自己的問題,我是如何解決這個問題的。 – matthew3r