2011-10-21 25 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