1

我在 SharpGL 中遇到了照明问题 - 我尝试了所有方法,结果仍然是灰色物体。我究竟做错了什么?我怎样才能让它工作?我想要一些阴影效果,随便什么。

在此处输入图像描述

这是我的代码:

private void Draw(OpenGL _openGl, float _rotateX, float _rotateY, float _rotateZ)
    {
        _openGl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
        _openGl.Enable(OpenGL.GL_DEPTH_TEST);
        _openGl.LoadIdentity();

        _openGl.Translate(0f, 0.0f, -15.0f);
        _openGl.Rotate(_rotateX, _rotateY, _rotateZ);

        _openGl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_POSITION, new [] {-50f, -50f, -50f, 1f});
        _openGl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_AMBIENT, new [] {0, 0, 0, 1});
        _openGl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_DIFFUSE, new [] {1, 1, 1, 1});
        _openGl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_SPECULAR, new [] {1, 1, 1, 1});
        _openGl.LightModel(OpenGL.GL_LIGHT_MODEL_AMBIENT, new [] { 0.15F, 0.15F, 0.15F, 0 });
        _openGl.Enable(OpenGL.GL_LIGHTING);
        _openGl.Enable(OpenGL.GL_LIGHT1);
        _openGl.Enable(OpenGL.GL_COLOR_MATERIAL);
        _openGl.Enable(OpenGL.GL_NORMALIZE);
        _openGl.LightModel(OpenGL.GL_LIGHT_MODEL_TWO_SIDE, 1);
        _openGl.Enable(OpenGL.GL_LIGHT_MODEL_TWO_SIDE);
        _openGl.ColorMaterial(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SPECULAR);
        _openGl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SPECULAR, new[] { 1, 1, 1, 1 });
        _openGl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_EMISSION, new[] { 0, 0, 0, 1 });
        _openGl.ShadeModel(OpenGL.GL_SMOOTH);

        _openGl.Begin(OpenGL.GL_TRIANGLES);

        if (!string.IsNullOrEmpty(sceneFilePath_))
            LoadSceneFromFile(_openGl);

        _openGl.End();
        _openGl.Flush();
    }
public void LoadSceneFromFile(OpenGL _openGl)
    {
        // Parsing from file...

        for (var i = 0; i < trianglesNumber; i++)
        {
            var part = trianglesParts[i];
            //_openGl.Color(partsParameters[part, 0], partsParameters[part, 1], partsParameters[part, 2]);
            _openGl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SPECULAR, new [] {partsParameters[part, 0], partsParameters[part, 1], partsParameters[part, 2]});
            _openGl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SHININESS, 500);

            _openGl.Normal(0, 1, 0);
            for (var j = 0; j < 3; j++)
            {
                _openGl.Normal(Math.Pow(vertices[trianglesVertices[i, j], 0], 2),
                    Math.Pow(vertices[trianglesVertices[i, j], 1], 2),
                    Math.Pow(vertices[trianglesVertices[i, j], 2], 2));
                _openGl.Vertex(vertices[trianglesVertices[i, j], 0], vertices[trianglesVertices[i, j], 1], vertices[trianglesVertices[i, j], 2]);
            }
        }
    }
4

0 回答 0