To add lights which will provide the illusion that part of our cube is exposed to a lightbulb and/or other parts of the cube are in darkness, we need to have a normal. A normal simply tells which direction the faces of our cube are facing. If a surface is facing the light, it gets brightly lit up. If a surface is not facing the light, it gets poorly lit up. So, let's set up our lights:
    Private Sub Lighting()
        Dim Wallpaper As Material
        'Of course, you cannot light an object that has no material -
        'we must define what type of light is reflected (what color we see)
        'from the material.
        'When drawing an object, this is the material that DirectX will put over it...
        'each triangle.
        Wallpaper.Ambient = Color.DarkKhaki
        Wallpaper.Diffuse = Color.AntiqueWhite

        D9.Material = Wallpaper


        'This is where we hook up "electricity" to all of the lights here.
        D9.Lights(0).Type = LightType.Point  'Regular lightbulb.
        D9.Lights(0).Position = New Vector3(-6.0F, 1.0F, 3.0F)  'Place the bulb here.
        D9.Lights(0).Range = 40.0F
        D9.Lights(0).Diffuse = Color.AliceBlue
        D9.Lights(0).Enabled = True
        D9.Lights(0).Commit()


    End Sub
Newer versions of DirectX do not require that the light be committed - enabling it does enough. Note that a surface that is going to be lit does not need to be colored. So, this means our vertex type should be PositionNormal rather than PositionNormalColored.
    Dim Vertices() As CustomVertex.PositionNormal
And the call to the new VertexBuffer initializer function:
            'Next, our vertex buffer.
            'I don't use overload #1 or #3 because I don't know how big a TransformedColored vertex is.
            VertexCount = 36
            VxB = New VertexBuffer(GetType(CustomVertex.PositionNormal), VertexCount, D9, Usage.WriteOnly, CustomVertex.PositionNormal.Format, Pool.Managed)
            'That is a LOT of non-trivial parameters.

            SetVertexBufferData(Vertices, VxB, D9)
The new function:
    Private Sub SetVertexBufferData(ByRef vs As CustomVertex.PositionNormal(), ByVal vxbf As VertexBuffer, ByVal D9 As Device)

        'After that workout, we now have to actually set the vertices.
        'We do this by locking the surface out of D9 while we "operate" on it.
        Dim A As Array = vxbf.Lock(0, LockFlags.None)
        'It returns a vanilla array...
        vs = DirectCast(A, CustomVertex.PositionNormal())
        'So we have to convert it to an array of TransformedColored vertices.

        'Remember: TransformColored vertices come with X, Y, Z, and Regularly Holding Wone, along with color.
        'PositionColored has no RHW: only X, Y, Z (position) and Color.
        'z = 0, 0,0,0
        vs(0) = New CustomVertex.PositionNormal(0.0F, 0.0F, 0.0F, -1.0F / RootThree, -1.0F / RootThree, -1.0F / RootThree)
        vs(1) = New CustomVertex.PositionNormal(2.0F, 0.0F, 0.0F, 1.0F / RootThree, -1.0F / RootThree, -1.0F / RootThree)
        vs(2) = New CustomVertex.PositionNormal(0.0F, 2.0F, 0.0F, -1.0F / RootThree, 1.0F / RootThree, -1.0F / RootThree)
        'z = 0, 2,2,0
        vs(3) = New CustomVertex.PositionNormal(2.0F, 2.0F, 0.0F, 1.0F / RootThree, 1.0F / RootThree, -1.0F / RootThree)
        vs(4) = vs(2)
        vs(5) = vs(1)
        'x = 0, 0,0,0
        vs(6) = vs(0)
        vs(7) = vs(2)
        vs(8) = New CustomVertex.PositionNormal(0.0F, 0.0F, 2.0F, -1.0F / RootThree, -1.0F / RootThree, 1.0F / RootThree)
        'x = 0, 0,2,2
        vs(9) = New CustomVertex.PositionNormal(0.0F, 2.0F, 2.0F, -1.0F / RootThree, 1.0F / RootThree, 1.0F / RootThree)
        vs(10) = vs(8)
        vs(11) = vs(2)
        'y = 0, 0,0,0
        vs(12) = vs(0)
        vs(13) = vs(8)
        vs(14) = vs(1)
        'y = 0, 2,0,2
        vs(15) = New CustomVertex.PositionNormal(2.0F, 0.0F, 2.0F, 1.0F / RootThree, -1.0F / RootThree, 1.0F / RootThree)
        vs(16) = vs(1)
        vs(17) = vs(8)
        'z = 2, 0,0,2
        vs(18) = vs(8)
        vs(19) = vs(9)
        vs(20) = vs(15)
        'z = 2, 2,2,2
        vs(21) = New CustomVertex.PositionNormal(2.0F, 2.0F, 2.0F, 1.0F / RootThree, 1.0F / RootThree, 1.0F / RootThree)
        vs(22) = vs(15)
        vs(23) = vs(9)
        'y = 2, 0,2,0
        vs(24) = vs(2)
        vs(25) = vs(3)
        vs(26) = vs(9)
        'y = 2, 2,2,2
        vs(27) = vs(21)
        vs(28) = vs(9)
        vs(29) = vs(3)
        'x = 2, 2,0,0
        vs(30) = vs(1)
        vs(31) = vs(15)
        vs(32) = vs(3)
        'x = 2, 2,2,2
        vs(33) = vs(21)
        vs(34) = vs(3)
        vs(35) = vs(15)

        'It's important to unlock the vertex buffer, so that D9 can see what we put in there.
        vxbf.Unlock()

    End Sub
I added these constants as well:
    Const RootTwo As Single = 1.4142135623731
    Const RootThree As Single = 1.73205080756888
Also, we need to set RenderStates - we already set Lighting to false - that can now be set to True since we do have lighting. In addition, we set ZBufferEnable - this tells the D3D device that it should actually treat the things we draw as if they are actually in 3D... otherwise, the device will draw everything that should be drawn to the screen (if we didn't cull our cube, we would see all six faces of it). This is important for lighting considerations.
            D9.RenderState.ZBufferEnable = True
            D9.RenderState.Lighting = True
            D9.RenderState.Ambient = Color.DarkGray     'When lighting is enabled and materials have been laid, this is the color of darkness.
For writing to the Z-buffer, we must enable the auto-depth stencil, which lets the device hold things in 3D or something to that effect.
        PP.EnableAutoDepthStencil = True
        'When we present, we draw from back to front.
        PP.AutoDepthStencilFormat = DepthFormat.D16
        'dunno what D16 stands for.
Of course, we cannot forget to actually turn on the lights.
        'Turn on the lights.
        Lighting()
And for drawing, make sure to clear the Z Buffer (now that we're drawing to it):
        D9.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Color.Black, 1.0F, 0)
        'The other overloads either sport an array of rectangles at the end, or make you assign a color in the ARGB integer format.
... and confirm that we are using the PositionNormal format.
        D9.VertexFormat = CustomVertex.PositionNormal.Format
        'We also need to tell the device what kind of vertices to draw.

.vb file