C# WinForms上的手动着色

C# WinForms上的手动着色,c#,winforms,graphics,3d,gdi+,C#,Winforms,Graphics,3d,Gdi+,我正在尝试制作一个简单的3d应用程序,允许用户创建一些3d图形并对其进行操作:旋转、平移等 所以现在我想做底纹,但它计算的是没有渐变的图形边框的颜色,所以看起来有点陌生。所以我可以计算不同顶点的亮度,但我不知道如何用梯度填充我的图形。例如,我有一个三角形,颜色相同,但亮度值不同。那我该怎么填呢 现在我这样画: private static readonly float[,] Floats; static FillVisualizer() { Floats

我正在尝试制作一个简单的3d应用程序,允许用户创建一些3d图形并对其进行操作:旋转、平移等

所以现在我想做底纹,但它计算的是没有渐变的图形边框的颜色,所以看起来有点陌生。所以我可以计算不同顶点的亮度,但我不知道如何用梯度填充我的图形。例如,我有一个三角形,颜色相同,但亮度值不同。那我该怎么填呢

现在我这样画:

    private static readonly float[,] Floats;
    static FillVisualizer()
    {
        Floats = BitmapHelper.GetBrightness(Resources.Shademap);
    }

    public override void Draw(Graphics graphics, VisualizableShape shape)
    {
        if (!shape.IsVisible)
            return;
        double x = shape.Normal.X*128 + 127;
        double y = shape.Normal.Y*128 + 127;
        var brightness = Floats[(int) x, (int) y]; 
        var color = Color.FromArgb(255, (int) (Pen.Color.R*brightness), (int) (Pen.Color.G*brightness), (int) (Pen.Color.B*brightness));
        graphics.FillPolygon(new SolidBrush(color), shape.Points.CastToPointF());
    }
shademap和“魔法常量”是从

因此,我的形状块上的所有顶点的亮度都是相同的,这就是为什么在某些情况下它看起来不好的原因:

所以这里我用的是FillPolygon,但它是用单一颜色填充的,什么时候应该用3(或4)个多边形点的亮度手动填充呢

请告诉我解决我问题的最简单方法


添加:thants到@bansi,他的url中的图像是我正在寻找的


所以我会尝试使用它。我希望它能起作用。

gdi+
winforms
中做这样的事情是一种痛苦。即使使用
WPF
,你也不会觉得很容易处理3D内容。尽管在
WPF
中进行3D操作是最简单的方法(与
GDI+
、DirectX和OpenGL或OpenTK相比)。另外,由于性能非常差,
GDI+
中的3D绘图也受到限制,代码将尽可能长且有缺陷
GDI+
是专为2D图形设计的,我认为。你可能需要看看@King King,我知道,但正如我所说,我应该“手动”绘制一个形状,所以在我的例子中,它是由许多单纯形、三角形或不规则矩形组成的。我没有使用WPF,因为我无法计算图像控件的大小。我不知道为什么,但这不是我第一次尝试获取控件大小,调用ActualWidth等时返回0。这就是为什么我使用WinForms和固定大小的PictureBox。无论如何,我所有的数字都在模型dll中封装,所以我可以简单地将其更改为WPF。在WPF中,我不能用一个木偶画,但这是必不可少的条件