[quote]Is the one on the left without specular or is that what your C++ program shows? Is this a sphere you generated the points for or are you using the built in sphere code (if you are using glutSphere switch to gluSphere which I’ve personally been using without much trouble).
You’ll probably have to post a little code so people can test it out/see what you might be doing wrong.
[/quote]
No problem. 
The one on the left is without specular enabled, the sphere is a milkshape 3D model using my own loader because I didn’t realise there was a port of the NeHe MS3D demo around.
What’s odd to me is I’m also get the same problem using a basic lighting vertex shader which calculates the half vector manually. There’s a thread similar here I found but tried the same thing and it didn’t work.
http://www.java-gaming.org/cgi-bin/JGNetForums/YaBB.cgi?board=jogl;action=display;num=1061872685;start=0#0
The code is essentially the same as that for the rendering part in the NeHe tutorial with lighting the same as I usually handle it in c++ (which came from gametutorials.com I think) and using Cg…
Light:
// Light setup
gl.glEnable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_LIGHT0);
gl.glEnable(GL.GL_COLOR_MATERIAL);
//gl.glColorMaterial(GL.GL_FRONT, GL.GL_SPECULAR);
float LightAmbient[]= { 0.0f, 0.0f, 0.0f, 1.0f }; // Ambient Light Values ( NEW )
float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Diffuse Light Values ( NEW )
float LightSpecular[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Diffuse Light Values ( NEW )
float LightPosition[]= { 0.0f, 50.0f, 17.0f, 1.0f }; // Light Position ( NEW )
gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, LightAmbient); // Setup The Ambient Light
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR,LightSpecular); // Setup The Diffuse Light
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION,LightPosition); // Position The Light
Material setup:
// Draw By Group
for ( int i = 0; i < m.nMeshes; i++ )
{
int materialIndex = m.m_pMeshes[i].m_materialIndex;
if ( materialIndex >= 0 )
{
gl.glMaterialfv( gl.GL_FRONT, gl.GL_AMBIENT, m.m_pMaterials[materialIndex].m_ambient );
gl.glMaterialfv( gl.GL_FRONT, gl.GL_DIFFUSE, m.m_pMaterials[materialIndex].m_diffuse );
//gl.glMaterialfv( gl.GL_FRONT, gl.GL_SPECULAR, m.m_pMaterials[materialIndex].m_specular );
//gl.glMateriali( gl.GL_FRONT, gl.GL_SHININESS, (int)m.m_pMaterials[materialIndex].m_shininess );
gl.glMaterialfv( gl.GL_FRONT, gl.GL_EMISSION, m.m_pMaterials[materialIndex].m_emissive );
if ( m.m_pMaterials[materialIndex].m_texture > 0 ) {
gl.glBindTexture( gl.GL_TEXTURE_2D, m.m_pMaterials[materialIndex].m_texture );
gl.glEnable( gl.GL_TEXTURE_2D );
}
else
gl.glDisable( gl.GL_TEXTURE_2D );
}
else
{
gl.glDisable( gl.GL_TEXTURE_2D );
}
gl.glBegin( gl.GL_TRIANGLES );
{
...