Public Class Form1

	Private WithEvents OverlayForm As New Form2
	Private vertices() As PointF

	Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
		vertices = GetPolygon()	'or define your own polygon ...
		With OverlayForm
			Using gp As New Drawing2D.GraphicsPath
				gp.AddPolygon(vertices)
				.Region = New Region(gp)
			End Using
			.FormBorderStyle = Windows.Forms.FormBorderStyle.None
			.Opacity = 0.35
			.ShowInTaskbar = False
			.Show(Me) 'the Me argument makes this form Owner of Form2
		End With
	End Sub

	'Keep the OverlayForm aligned with this Form
	Private Sub Form1_Move_etc(sender As System.Object, e As System.EventArgs) Handles Me.Shown, Me.SizeChanged, Me.Move
		OverlayForm.Bounds = Me.Bounds
	End Sub

	'Paint the polygon on the OverlayForm
	Private Sub OverlayForm_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles OverlayForm.Paint
		e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
		e.Graphics.FillPolygon(Brushes.Yellow, vertices)
		Using pn As New Pen(Color.BlueViolet, 2)
			e.Graphics.DrawPolygon(pn, vertices)
		End Using
	End Sub

	'This is an example function to generate the sawtooth polygon:
	Private Function GetPolygon() As PointF()
		Dim vList As New List(Of PointF)
		Dim gp1 As New Drawing2D.GraphicsPath
		gp1.AddEllipse(40, 85, 300, 200)
		gp1.Flatten(Nothing, 5)
		Dim gp2 As New Drawing2D.GraphicsPath
		gp2.AddEllipse(60, 120, 250, 140)
		gp2.Flatten(Nothing, 5)
		For i As Integer = 0 To gp1.PointCount - 1
			vList.Add(gp2.PathPoints(i))
			vList.Add(gp1.PathPoints(i))
		Next
		Return vList.ToArray
	End Function
End Class

'Form 2 is just a double buffered form. 
'You could add it to the project and set the DoubleBuffered property in the Designer instead.
Public Class Form2
	Inherits Form
	Public Sub New()
		Me.DoubleBuffered = True
	End Sub
End Class