OpenGL Normals не работают? - PullRequest
       25

OpenGL Normals не работают?

3 голосов
/ 14 декабря 2010

Я работаю над проектом OpenGL и хочу хотя бы немного осветить его.Я пытаюсь использовать OpenGL, встроенные в освещение в течение некоторого времени, но я не добиваюсь большого успеха.

У загружаемых моделей правильные нормали (рассчитанные Wings3D) прикреплены к вершинам в следующем порядке:

loop all faces {
    GL.Normal3(...);
    GL.TexCoord2(...);
    GL.Vertex3(...);
    ... (two more in same order, faces are all triangles)
}

Модели имеют несколько вызовов Material до GL.Begin(BeginMode.Triangles), например:

GL.Material(MaterialFace.FrontAndBack, MaterialParameter.AmbientAndDiffuse, new float[] { 1.0f, 1.0f, 1.0f, 1.0f });
GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Specular, new float[] { 1.0f, 1.0f, 1.0f, 1.0f });
GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, 99.0f);

Вот первые три нормали первой загруженной модели (проверка достоверности) n (x,y, z):

0(0.6331236,    0.428246439,  0.6447942)
1(0.507037938,  -0.6987222,   0.504677951)
2(-0.768829644, -0.494915247, 0.404919624)

Вот как я настраиваю освещение:

GL.Enable(EnableCap.DepthTest);
GL.Enable(EnableCap.Blend);
GL.Enable(EnableCap.ColorMaterial);
GL.Enable(EnableCap.Texture2D);
GL.Enable(EnableCap.Normalize);

GL.ShadeModel(ShadingModel.Flat);

GL.Enable(EnableCap.Lighting);
GL.Enable(EnableCap.Light0);
GL.Light(LightName.Light0, LightParameter.Position, new float[] { 0.0f, 1000.0f, 0.0f, 1.0f });
GL.Light(LightName.Light0, LightParameter.Ambient, new float[] { 1.0f, 1.0f, 1.0f, 1.0f });
GL.Light(LightName.Light0, LightParameter.Specular, new float[] { 0.0f, 0.0f, 0.0f, 0.0f });
GL.Light(LightName.Light0, LightParameter.Diffuse, new float[] { 1.0f, 1.0f, 1.0f, 1.0f });
GL.Light(LightName.Light0, LightParameter.SpotExponent, 0.0f);

Объекты реагируют на воспроизводимые настройки, но, к сожалению, все лица имеют одинаковую яркость.

Я что-то упустил или я делаю что-то не так?

1 Ответ

3 голосов
/ 14 декабря 2010

Установка Ambient light на {1,1,1,1} означает, что все будет полностью освещено, независимо от направления света. Попробуйте установить значения Ambient ниже (например, 0,2f), чтобы компонент Diffuse мог иметь некоторый эффект.

...