Lighting distorts my vertex

Started by
2 comments, last by Evil Steve 17 years, 6 months ago
Hi there i am having a strange problem. Whenever i try and apply lighting to scene, it completely disrupts my triangle. (it looks like a leaf that was eaten by a caterpillar!) Does anybody know whats wrong?
Public Class Form1
    Inherits System.Windows.Forms.Form

    Dim Device As Microsoft.DirectX.Direct3D.Device
    Dim Disp As DisplayMode = Microsoft.DirectX.Direct3D.Manager.Adapters(0).CurrentDisplayMode
    Dim mcaps = Manager.GetDeviceCaps(0, DeviceType.Hardware)

#Region " Windows Form Designer generated code "
#End Region

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        InitializeGraphics(Me, Disp, True)

        Me.Show()
        Dim myvertb = New Direct3D.VertexBuffer(GetType(CustomVertex.PositionNormal), 3, Device, Usage.WriteOnly, CustomVertex.PositionNormal.Format, Pool.Managed)

        Device.Transform.World = Matrix.Identity
        Device.Transform.View = Matrix.Identity
        Device.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 3.0, 1.0, 0.1, 1000.0)
        Device.RenderState.CullMode = Cull.None
        Device.RenderState.ZBufferEnable = True
        Dim mtrl As Direct3D.Material = New Direct3D.Material()
        mtrl.Ambient = System.Drawing.Color.White
        mtrl.Diffuse = System.Drawing.Color.White
        Device.Material = mtrl
        Device.Lights(0).Type = LightType.Directional
        Device.Lights(0).Diffuse = System.Drawing.Color.DarkTurquoise
        Device.Lights(0).Direction = New Vector3(-5, -5, 5)
        Device.RenderState.Lighting = False
        Device.RenderState.Ambient = System.Drawing.Color.FromArgb(0, 20, 20, 20)

        Dim verts(3) As CustomVertex.PositionNormal
        verts(0) = New CustomVertex.PositionNormal()
        verts(0).X = -10
        verts(0).Y = 0
        verts(0).Z = 10
        verts(1) = New CustomVertex.PositionNormal()
        verts(1).X = 0
        verts(1).Y = -10
        verts(1).Z = 10
        verts(2) = New CustomVertex.PositionNormal()
        verts(2).X = 5
        verts(2).Y = 5
        verts(2).Z = 200

        myvertb.setdata(verts, 0, Direct3D.LockFlags.None)

        Device.Clear(ClearFlags.Target, Color.Blue, 1, 0)
        Device.BeginScene()
        Device.SetStreamSource(0, myvertb, 0)
        Device.VertexFormat = CustomVertex.PositionNormal.Format
        Device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)

        Device.EndScene()
        Device.Present()
        Application.DoEvents()

    End Sub

    Private Function InitializeGraphics(ByVal frm As Control, ByVal Disp As DisplayMode, ByVal Windowed As Boolean) As Boolean
        Dim PParams As PresentParameters = New PresentParameters()
        PParams.Windowed = False
        PParams.SwapEffect = SwapEffect.Discard
        PParams.AutoDepthStencilFormat = DepthFormat.D16
        PParams.BackBufferCount = 1
        PParams.BackBufferFormat = Disp.Format
        PParams.BackBufferHeight = 768
        PParams.BackBufferWidth = 1024
        PParams.MultiSample = MultiSampleType.None
        PParams.MultiSampleQuality = 0
        PParams.EnableAutoDepthStencil = True
        PParams.PresentFlag = PresentFlag.DiscardDepthStencil
        PParams.FullScreenRefreshRateInHz = Disp.RefreshRate
        PParams.PresentationInterval = PresentInterval.Immediate

        REM THIS ERRORS NO MORE
        Device = New Device(0, DeviceType.Hardware, Me.Handle, CreateFlags.HardwareVertexProcessing, PParams)

sgBox("yebo")
    End Function
End Class
EDIT: Please remember to use 'source' tags. [Edited by - jollyjeffers on October 2, 2006 7:17:14 AM]
Advertisement
Alright, so I still cant get it right. I have tried looking for an answer all over the net!
Here is the latest code i have tried and a picture of what the problem looks like.

The lighting appears to be working, the triangle is yellowish, but its still scattered and dissolved, what could be wrong?




Imports Microsoft.directx
Imports Microsoft.directx.Direct3D

Public Class Form1
Inherits System.Windows.Forms.Form

Dim Device As Microsoft.DirectX.Direct3D.Device
Dim Disp As DisplayMode = Microsoft.DirectX.Direct3D.Manager.Adapters(0).CurrentDisplayMode
Dim mcaps = Manager.GetDeviceCaps(0, DeviceType.Hardware)

#Region " Windows Form Designer generated code "
#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

InitializeGraphics()

Me.Show()
Dim myvertb = New Direct3D.VertexBuffer(GetType(CustomVertex.PositionNormal), 3, Device, Usage.WriteOnly, CustomVertex.PositionNormal.Format, Pool.Managed)

Device.Transform.World = Matrix.Identity
Device.Transform.View = Matrix.Identity
Device.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 3.0, 1.0, 1, 1000)
Device.RenderState.CullMode = Cull.None
Device.RenderState.ZBufferEnable = True
Dim mtrl As Direct3D.Material = New Direct3D.Material()
mtrl.Ambient = System.Drawing.Color.FromArgb(0, 250, 250, 250)
Device.Material = mtrl
Device.RenderState.Lighting = True
Device.RenderState.Ambient = System.Drawing.Color.FromArgb(0, 250, 250, 20)

Dim verts(3) As CustomVertex.PositionNormal
verts(0) = New CustomVertex.PositionNormal()
verts(0).X = -5
verts(0).Y = 0
verts(0).Z = 6
verts(1) = New CustomVertex.PositionNormal()
verts(1).X = 0
verts(1).Y = -5
verts(1).Z = 6
verts(2) = New CustomVertex.PositionNormal()
verts(2).X = 3
verts(2).Y = 3
verts(2).Z = 6

myvertb.setdata(verts, 0, Direct3D.LockFlags.None)

Device.Clear(ClearFlags.Target, Color.Blue, 1, 0)
Device.BeginScene()
Device.SetStreamSource(0, myvertb, 0)
Device.VertexFormat = CustomVertex.PositionNormal.Format
Device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1)

Device.EndScene()
Device.Present()
Application.DoEvents()

End Sub

Private Function InitializeGraphics() As Boolean
Dim PParams As PresentParameters = New PresentParameters()
PParams.Windowed = True
PParams.SwapEffect = SwapEffect.Discard
PParams.AutoDepthStencilFormat = DepthFormat.D16
PParams.EnableAutoDepthStencil = True
PParams.PresentFlag = PresentFlag.DiscardDepthStencil

Device = New Device(0, DeviceType.Hardware, Me.Handle, CreateFlags.HardwareVertexProcessing, PParams)

End Function
End Class
OK update:

I have discovered that lighting has nothing to do with my problem. It is when i try to use the autodepthstencil that my triagle primitive goes through the meat grinder, otherwise it works fine when i disable it.
For now i can carry on, but when i need to start using z-buffers, this is going to be a big problem.

Any one got any ideas as to what the problem is?
You need to clear the depth buffer as well as the backbuffer. In C++, this is done by passing D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET to IDirect3DDevice::Clear(), I imagine the C#/VB equivalent is similar.

This topic is closed to new replies.

Advertisement