Simple renderer in .net with SharpGL (openGL)


Re: Simple renderer in .net with direct3d
#6
Please note that all lines with ' are comments
and sorry for my german comments:

This is to set the renderscene:
Code:
Public Sub InitSettings() ' Das hier sollte Sie erst einmal auch nicht kümmern. ' Hier wird mit Hilfe einer Matrix festgelegt, wie ' die einzelnen Objekte zu rendern sind. Dim Lookat As New Vector3 Dim CameraPosition As New Vector3 Dim UpDown As New Vector3 Dim Factor As Integer = 3 With Lookat .X = gLookAt.X .Y = gLookAt.Y .Z = gLookAt.Z End With With CameraPosition .X = 123.182831 / Factor '-70 .Y = -100.578362 / Factor '-50 .Z = -125.182831 / Factor '-100 End With With UpDown .X = 0 '-0.35 .Y = -1 '-0.866 .Z = 0 '0.35 End With 'declare the World as identity matrix matWorld = Matrix.Identity 'D3DDevice.SetTransform(TransformType.World1, matWorld) D3DDevice.SetTransform(TransformType.View, matWorld) 'd3ddevice.SetTransform( ' Diese Matrix kann man als Kamera betrachten, mit ' der sich das Sichtfeld modifizieren lässt. ' Der erste MakeVector ist der Standort der Camera 100, -100, 100 ' Der zweite MakeVector ist der Lookat Punkt 0, 0, 0 ' Der dritte MakeVector bestimmt oben und unten 0, -1 , 0 matView = Matrix.LookAtLH(CameraPosition, Lookat, UpDown) D3DDevice.SetTransform(TransformType.View, matView) ' Mit der Projektion-Matrix legen wir Sichtweite und ' Sichtwinkel fest. 'Die beiden letzten Werte legen fest was man sieht, bei 1 ,1000 ist alles ok 'bei 0.001 , 1000 sieht man hindurch 'matProj = Matrix.PerspectiveFovLH((Pi / 4), 4 / 3, 10, 1000) matProj = Matrix.PerspectiveFovLH((Pi / 4), frmLDParts.Panel1.Width / frmLDParts.Panel1.Height, 10, 1000) D3DDevice.SetTransform(TransformType.Projection, matProj) ' Jetzt teilen wir dem Device noch mit, welches ' Art Vertex wir haben D3DDevice.VertexFormat = CType(D3DFVF_COLORVERTEX, VertexFormats) 'With vbLightAmbient ' .a = 255 ' .b = 125 ' .g = 125 ' .r = 125 'End With 'vbLight.Ambient = vbLightAmbient Dim vbTestBench As New VertexBuffer(D3DDevice, 400, Usage.Points, CType(D3DFVF_COLORVERTEX, VertexFormats), Pool.Default) 'MsgBox("Vertexbuffer.SizeInBytes: " & test.SizeInBytes) Dim descr As VertexBufferDescription = vbTestBench.Description 'MsgBox("VertexbufferDecsription.VertexFormat: " & descr.VertexFormat) 'Dim descr As VertexBufferDescription 'descr.Format = Format.VertexData 'descr.VertexFormat = D3DFVF_COLORVERTEX 'descr.Usage = Usage.Points 'descr.Type = ResourceType.VertexBuffer ' Und noch ein paar Einstellungen 'D3DDevice.SetRenderState(RenderStates.ZEnable, True) D3DDevice.RenderState.ZBufferWriteEnable = True 'D3DDevice.SetRenderState(RenderStates.Lighting, False) D3DDevice.RenderState.Lighting = False 'D3DDevice.SetRenderState(RenderStates.FillMode, FillMode.Solid) D3DDevice.RenderState.FillMode = FillMode.Solid 'D3DDevice.SetRenderState(RenderStates.CullMode, Cull.CounterClockwise) D3DDevice.RenderState.CullMode = Cull.None D3DDevice.RenderState.AntiAliasedLineEnable = True D3DDevice.RenderState.LocalViewer = True 'D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW End Sub


The main loop:
Code:
Public Sub Mainloop() ' Der MainLoop läuft solange wie wir die ' bRunning-Variable auf 'true' lassen Do While bRunning ' Das vorher Gezeichnete löschen, indem wir es mit ' grauer Farbe übermalen D3DDevice.Clear((Direct3D.ClearFlags.Target Or Direct3D.ClearFlags.ZBuffer), Color.WhiteSmoke, 1.0F, 0) 'D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HC0C0C0, 1.0#, 0 '&HFF& = Blau '&HAA& = ' Dem Device sagen, dass das "rendern gleich ' beginnt" D3DDevice.BeginScene() ' Und nun lassen wir das Ganze noch rotieren Rotation = Rotation + 0.01 matWorld = Matrix.Identity matRotation = Matrix.RotationY(CSng(Rotation * 1 * Pi / 180)) matWorld = Matrix.Multiply(matWorld, matRotation) 'D3DDevice.SetTransform(TransformType.World, matWorld) ' Hier "rendern" wir unsere Szene 'Debug.Print("Start Rendern") If UBound(gLines) > 0 Then D3DDevice.DrawUserPrimitives(PrimitiveType.LineList, CInt(CLng(UBound(gLines) / 2)), gLines) End If 'Dim a As New Line(D3DDevice) 'a.Begin() 'a.DrawTransform(gLines, matWorld, gLines(1).Color) 'a.End() If UBound(gTriangles) > 0 Then D3DDevice.DrawUserPrimitives(PrimitiveType.TriangleList, CInt(CLng(UBound(gTriangles) / 3)), gTriangles) End If 'MsgBox(UBound(Quads)) If UBound(gQuads) > 0 Then D3DDevice.DrawUserPrimitives(PrimitiveType.TriangleList, CInt(CLng(UBound(gQuads) / 3)), gQuads) End If 'D3DDevice.SetTexture(0, Textur) 'D3DDevice.VertexFormat = CustomVertex.PositionTextured.Format 'Debug.Print("End Rendern") ' Rendern beendet D3DDevice.EndScene() ' Und das Ganze "präsentieren" D3DDevice.Present() ' Jeder, der schon mal einen Loop ohne Beendigungs- ' Bedingung gebastelt hat, weiß, dass man ein ' Doevents braucht, um noch Eingaben in seinen ' PC machen zu können My.Application.DoEvents() 'bRunning = False Loop End Sub

Maybe you can see in the code above why my picture with this renderer is mirrored.
Reply
« Next Oldest | Next Newest »



Messages In This Thread
Re: Simple renderer in .net with direct3d - by Michael Heidemann - 2013-11-23, 18:48

Forum Jump:


Users browsing this thread: 1 Guest(s)