3

私は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);

ロードされた最初のモデルの最初の3つの法線(信頼性チェック)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);

オブジェクトは再生されている設定に反応しますが、悲しいことにすべての面が同じ明るさです。

私は何かが足りないのですか、それとも何か間違ったことをしていますか?

4

1 に答える 1

3

アンビエントライトを{1,1,1,1}に設定すると、ライトからの方向に関係なく、すべてが完全に点灯します。拡散コンポーネントが何らかの効果を発揮できるように、周囲値を低く設定してみてください(例:0.2f)。

于 2010-12-13T22:45:59.650 に答える