2010-04-15 57 views
2

这是一个简单的问题,我有些惭愧地要求帮助。照明不适用于gluSphere

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

这是照明代码在我的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); 

这是我显示我的球代码()函数:

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:

布拉赫,我想我有一个:

gl.glEnable(GL.GL_TEXTURE_2D); 

在某处活跃,并且如果没有与其关联的纹理,它会导致我的模型不具有阴影。 - 继续做好人,继续下去。

回答

0

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

+0

在这一点上,任何老照明,我所得到的只是一个黑球。 照明值如下,但是,我不确定是否会有所帮助。他们对于我用我自己的法线手动构建的任何形状都能很好地工作。也许我需要实现我自己的球形码。 已被添加到帖子因为评论没有自动格式。 – badcodenotreat 2010-04-15 17:25:39

+0

对不起,我误解了你的函数调用。你传递的第四个参数是什么? – 2010-04-15 17:38:56

+0

不知道,这是JOGL特有的参数。抵消? – badcodenotreat 2010-04-15 17:45:05

0
  1. 你有没有可能影响光线位置的翻译/旋转?
  2. GL_COLOR_MATERIAL是启用还是禁用?如果是,它可能会覆盖您的材质设置。
  3. 即使您的代码未启用GL_TEXTURE_2D,也应该在到达行之前手动禁用它,以防万一。
  4. 如果您希望完全忽略gluSphere,您可以使用this thread中的一些代码。
0

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