我使用SharpGL.

我试着画三个有三种不同 colored颜色 的重叠球体,如下所示-

enter image description here

然而,我得到如下输出-

enter image description here

换句话说,gl.Color()对绘制的对象没有影响.

  • How can I fix this?

Source Code:

public static class OpenGLhelper
{
    public static void Init(OpenGL gl)
    {            
        float[] mat_specular = { 1.0f, 1.0f, 1.0f, 1.0f };
        float[] mat_shininess = { 50.0f };
        float[] light_position = { 0.5f, 0.5f, 0.750f, 0.0f };
        gl.ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.ShadeModel(OpenGL.GL_SMOOTH);

        gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SPECULAR, mat_specular);
        gl.Material(OpenGL.GL_FRONT, OpenGL.GL_SHININESS, mat_shininess);
        gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, light_position);

        gl.Enable(OpenGL.GL_LIGHTING);
        gl.Enable(OpenGL.GL_LIGHT0);
        gl.Enable(OpenGL.GL_DEPTH_TEST);

        //// Cull back faces.
        gl.Enable(OpenGL.GL_CULL_FACE);
        gl.CullFace(OpenGL.GL_BACK);
        gl.FrontFace(OpenGL.GL_CW);
    }

    private static void drawSphere(OpenGL gl, Point3d c, Rgb color, double r, int n)
    {
        int i, j;
        double theta1, theta2, theta3;
        Point3d e = new Point3d();
        Point3d p = new Point3d();

        if (c == null)
        {
            c = new Point3d(0, 0, 0);
        }

        double twoPi = Math.PI * 2;
        double piD2 = Math.PI / 2;
        if (r < 0)
            r = -r;
        if (n < 0)
            n = -n;
        if (n < 4 || r <= 0)
        {
            gl.Begin(OpenGL.GL_POINTS);
            gl.Color(color.Red, color.Green, color.Blue);
            gl.Vertex(c.X, c.Y, c.Z);
            gl.End();
            return;
        }

        for (j = 0; j < n / 2; j++)
        {
            theta1 = j * twoPi / n - piD2;
            theta2 = (j + 1) * twoPi / n - piD2;

            gl.Begin(OpenGL.GL_QUAD_STRIP);
            for (i = 0; i <= n; i++)
            {
                theta3 = i * twoPi / n;

                e.X = Math.Cos(theta2) * Math.Cos(theta3);
                e.Y = Math.Sin(theta2);
                e.Z = Math.Cos(theta2) * Math.Sin(theta3);
                p.X = c.X + r * e.X;
                p.Y = c.Y + r * e.Y;
                p.Z = c.Z + r * e.Z;

                gl.Normal(e.X, e.Y, e.Z);
                gl.TexCoord(i / (double)n, 2 * (j + 1) / (double)n);
                gl.Color(color.Red, color.Green, color.Blue);
                gl.Vertex(p.X, p.Y, p.Z);

                e.X = Math.Cos(theta1) * Math.Cos(theta3);
                e.Y = Math.Sin(theta1);
                e.Z = Math.Cos(theta1) * Math.Sin(theta3);
                p.X = c.X + r * e.X;
                p.Y = c.Y + r * e.Y;
                p.Z = c.Z + r * e.Z;

                gl.Normal(e.X, e.Y, e.Z);
                gl.TexCoord(i / (double)n, 2 * j / (double)n);
                gl.Color(color.Red, color.Green, color.Blue);
                gl.Vertex(p.X, p.Y, p.Z);
            }
            gl.End();
        }
    }

    public static void Display(OpenGL gl)
    {
        gl.Clear(OpenGL . GL_COLOR_BUFFER_BIT | OpenGL . GL_DEPTH_BUFFER_BIT);
        
        drawSphere(gl, new Point3d(0, 0, 0), new Rgb(1, 0, 0), 0.5, 20);
        drawSphere(gl, new Point3d(0, 0.5, 0), new Rgb(0, 1, 0), 0.5, 20);
        drawSphere(gl, new Point3d(0, -0.5, 0), new Rgb(0, 0, 1), 0.5, 20);

        gl.Flush();
    }

    public static void Reshape(OpenGL gl, int width, int height)
    {  
    }
}

public partial class SharpGLForm : Form
{
    private float rotation = 0.0f;

    public SharpGLForm()
    {
        InitializeComponent();

        OpenGL gl = openGLControl1.OpenGL;
        OpenGLhelper.Init(gl);
    }

    private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e)
    {
        OpenGL gl = openGLControl1.OpenGL;

        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

        gl.LoadIdentity();
        gl.Translate(0.0f, 0.0f, -4.0f);  // Move into the screen
        gl.Rotate(rotation, 0.0f, 1.0f, 0.0f);

        OpenGLhelper.Display(gl);

        rotation += 3.0f;
    }
}

推荐答案

启用照明(GL_LIGHTING)时,渲染 colored颜色 由material 参数(glMaterial)定义.如果要用glColor定义 colored颜色 ,必须启用GL_COLOR_MATERIAL

gl.Enable(OpenGL.GL_LIGHTING);
gl.Enable(OpenGL.GL_COLOR_MATERIAL);
gl.ColorMaterial(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_AMBIENT_AND_DIFFUSE);

或者将material colored颜色 设置为GL.Material.例如.:

float[] ambient_diffuse_color = { 1.0f, 0.0f, 0.0f, 1.0f }; // RED
GL.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_AMBIENT_AND_DIFFUSE,
            ambient_diffuse_color);

Csharp相关问答推荐

C#使用属性和值将JSON转换为XML

如何注销Microsoft帐户?

Blazor Foreach仅渲染最后一种 colored颜色

更新产品但丢失产品ASP.NET Core的形象

S能够用DATETIME来计算,这有什么错呢?

只有第一个LINQ.Count()语句有效

UWP中的任务和界面

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

DateTime ToString()未以指定格式打印

使用ExtractIconEx(或其他方式)提取最大的可用图标

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

如何在microsoft.clearscript.v8的jsondata中使用Linq

如何更改Datagridview行标题

最小API定义的Swagger标头参数

除非首先访问使用的终结点,否则本地API上的终结点不起作用

如果图表S批注包含使用LINQ的具有特定名称的批注,我如何签入C#

从具有泛型类型约束的类继承-Blazor

ASP.NET核心中的验证错误-该字段为必填字段