照明不适用于gluSphere

时间:2010-04-15 17:11:59

标签: opengl graphics jogl

这是一个简单的问题,我有点羞于寻求帮助。

我正在简单地调用gluSphere来渲染一个球体,但是,即使我非常确定我正确地添加了法线和光照,它也不会正确点亮。但是,如果我添加一个纹理,模型会正常点亮,除非它看起来总是光滑的,我无法将其更改为平面。

这是我的init()函数中的灯光代码:

gl.glLightfv( GL.GL_LIGHT0, GL.GL_AMBIENT , AMBIENT_LIGHT, 0 );
gl.glLightfv( GL.GL_LIGHT0, GL.GL_DIFFUSE , DIFFUSE_LIGHT, 0 );
gl.glLightfv( GL.GL_LIGHT0, GL.GL_POSITION, light_pos    , 0 );
gl.glEnable ( GL.GL_LIGHT0 );
gl.glEnable ( GL.GL_LIGHTING );

这是我的display()函数中的球体代码:

gl.glColor3d(1.0, 1.0, 1.0);
glu.gluQuadricDrawStyle  (quad, GLU.GLU_FILL);
glu.gluQuadricNormals    (quad, GLU.GLU_FLAT);
glu.gluQuadricOrientation(quad, GLU.GLU_OUTSIDE);

glu.gluSphere(quad, 1.0, lat, lon);

请告知。

编辑: 光值:

public final static float[] DIFFUSE_LIGHT  = {  1.0f, 1.0f,  1.0f, 1.0f };
public final static float[] AMBIENT_LIGHT  = {  0.3f, 0.3f,  0.3f, 1.0f };
public              float[] light_pos      = { -2.0f, 2.0f, 10.0f, 0.0f };

添加了材料,没有变化:

gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT , new float[]{0.5f, 0.5f, 0.5f, 1.0f}, 0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE , new float[]{1.0f, 1.0f, 1.0f, 1.0f}, 0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, new float[]{0.7f, 0.7f, 0.7f, 1.0f}, 0);
gl.glMaterialf (GL.GL_FRONT, GL.GL_SHININESS, 0.5f);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_EMISSION, new float[]{0.3f, 0.3f, 0.3f, 0.0f}, 0);

EDIT2:

Blah,我认为我有一个:

gl.glEnable(GL.GL_TEXTURE_2D);

在某处活动,如果没有与之关联的纹理,它会导致我的模型没有阴影。 -_-继续做好人,继续。

3 个答案:

答案 0 :(得分:2)

我也遇到了照明问题,并且发现我需要添加glEnable(GL_NORMALIZE)

答案 1 :(得分:0)

您期待什么样的照明? glLightfv的第三个参数应该是您正在设置的灯光的值。

答案 2 :(得分:0)

  1. 您是否有任何可能影响灯光位置的翻译/旋转?
  2. 是否启用或禁用了GL_COLOR_MATERIAL?如果是,它可能会覆盖您的材料设置。
  3. 即使您的代码未启用GL_TEXTURE_2D,您也应该尝试在到达该行之前手动禁用它,以防万一。
  4. 如果您想完全忽略gluSphere,可以使用this thread中的一些代码。