Lichter, die nicht leuchten



  • Servus,

    eine kurze Frage: Unten befindet sich ein kurzer Quelltext, auf das wesentliche gekürzt und mein mein Problem ist nun, dass bei Aktivierung der Belichtung nur ein schwarzer Bildschirm angezeigt wird. Deaktiviere ich das Licht über Lighting = false, wird alles optimal angezeigt.

    Habe jetzt diverse Foren und Tutorials durchgearbeitet, nur sehe ich das Problem nicht. Für jede Hilfestellung wäre ich sehr dankbar.
    Benötige ich für eine Beleuchtung Normalenvektoren, oder sind diese nur für ein einwandfreies Gouroud-Shading nötig?

    Gruße,
    das 2. Lichtkind

    PresentParameters oPresentParameter = new PresentParameters();
    
    oPresentParameter.Windowed = true;
    oPresentParameter.SwapEffect = SwapEffect.Copy;
    oPresentParameter.DeviceWindow = oForm;
    
    oPresentParameter.EnableAutoDepthStencil = true; // Turn on a Depth stencil
    oPresentParameter.AutoDepthStencilFormat = DepthFormat.D16; // And the stencil format
    oPresentParameter.PresentationInterval = PresentInterval.One;
    
    // Creates device
    
    m_oDevice = new Device(0, DeviceType.Hardware, oForm, 
    	CreateFlags.SoftwareVertexProcessing, oPresentParameter );
    
    oDevice.RenderState.CullMode = Cull.None;
    oDevice.RenderState.Lighting = true;
    oDevice.RenderState.ZBufferEnable = true;
    
    m_oMapBuffer = new VertexBuffer ( 
     typeof ( CustomVertex.PositionColored,
     m_oOlkgame.Map.GetArea() * 6,
     oDevice, 
     Usage.WriteOnly,
     CustomVertex.PositionColored.Format, Pool.Default );
    .......................
    ////////////////////////////////////////
    
    GraphicsStream stm = m_oMapBuffer.Lock(0, 0, 0);
    
    CustomVertex.PositionColored[] verts = 
    	new CustomVertex.PositionColored [ m_oOlkgame.Map.GetArea() * 6 ];
    
    ....
    
    int nOffset = 0;
    
    ....
    verts [ nOffset ].X = nCounterX * 64;
    verts [ nOffset ].Y = nCounterY * 64;
    verts [ nOffset ].Z = oEdge1.Height * 4;
    verts [ nOffset ].Color = Map.Map2D.GetEdgeColor ( oEdge1 ).ToArgb();	
    .....
    
    stm.Write(verts);
    m_oMapBuffer.Unlock();
    ..............................
    ////////////////////////////////
    
    oDevice.Transform.View = Matrix.LookAtLH ( new Vector3 ( 0, 0, 1000 ),
    	new Vector3 ( 640, 640 + m_nCurrentX, 0 ), new Vector3 ( 0, 0, 1 ) );
    oDevice.RenderState.FillMode = FillMode.Solid;
    oDevice.Transform.Projection = Matrix.PerspectiveFovLH(
    	(float) Math.PI / 4, 1.0f, 0.1f, 10000.0f );	
    
    oDevice.Lights [ 0 ].Type = LightType.Point;
    oDevice.Lights [ 0 ].Diffuse = System.Drawing.Color.White;
    oDevice.Lights [ 0 ].Position = new Vector3 ( 1000, 500, 5000 );
    oDevice.Lights [ 0 ].Enabled = true;
    oDevice.Lights [ 0 ].Update();
    
    oDevice.RenderState.Ambient = System.Drawing.Color.White;
    oDevice.RenderState.DiffuseMaterialSource = ColorSource.Material;
    Material oMaterial = new Material();
    oMaterial.Diffuse = System.Drawing.Color.White;
    oDevice.Material = oMaterial;
    
    oDevice.SetStreamSource( 0, m_oMapBuffer, 0);
    oDevice.VertexFormat = CustomVertex.PositionColored.Format;
    
    oDevice.DrawPrimitives( PrimitiveType.TriangleList, 0, Game.Map.GetArea() * 2);
    


  • Du brauchst Normalen. Bei Lighting=true immer sonst sind sie schwarz.



  • Danke sehr!

    Werde mich wieder melden, wenn das nicht hinhaut 🙂


Anmelden zum Antworten