好的,我制作了一个“天空盒”(实际上是 5 个平面,因为纹理不同)。它工作正常,但闪电有问题。这不是我在 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();
}
所以问题是我怎样才能让它在我所在的每个地方都能正常工作。我希望有人可以帮助我,因为现在看起来不太好(没有灯光很好,但我真的不想要夜景,尤其是有太阳的地方有纹理:)。
编辑(现在如何工作):就像在答案中一样,天空盒不再有法线,但是在我启用闪电之后,我需要将此行添加到代码中,现在它就像一个魅力一样工作,并且天空到处都是明亮的。
gl.glLightModelf(GL10.GL_LIGHT_MODEL_TWO_SIDE, GL10.GL_TRUE);