Casino online









Mercato forex






B7. Usare i Buffer


Quello che stiamo per fare non comporta nessun cambiamento nella visualizzazione del terreno, ma serve per alleviare il carico di elaborazione della GPU. Anzichè passare gli array di Vertici e di Indici ogni volta come parametri del metodo di disegno, li incorporiamo direttamente nel device grafico, per rendere più veloce il calcolo. Questo si fa utilizzando altre due semplici variabili, rispettivamente di tipo VertexBuffer e IndexBuffer:
Public Class Game

    '...
    
    'Dichiara i due nuovi buffer di vertici e di indici
    Private VBuffer As VertexBuffer
    Private IBuffer As IndexBuffer
    
    '...
    
    Private Sub CopyToBuffer()
        'Inizializza il buffer di vertici. Il secondo
        'parametro specifica quanta memoria occuperà il
        'buffer, mentre il terzo dice alla GPU che quell'area
        'è di sola scrittura
        VBuffer = New VertexBuffer(Me.GraphicsDevice, _
            Vertices.Length * VertexPositionNormalColor.SizeInBytes, _
            BufferUsage.WriteOnly)
        'E gli passa i dati veri e propri
        VBuffer.SetData(Vertices)

        'Inizializza il buffer di indici
        IBuffer = New IndexBuffer(Me.GraphicsDevice, _
            GetType(Int32), Indices.Length, BufferUsage.WriteOnly)
        'E gli passa i dati veri e propri
        IBuffer.SetData(Indices)

        'Inserisce i buffer dentro il device grafico
        Me.GraphicsDevice.Indices = IBuffer
        Me.GraphicsDevice.Vertices(0).SetSource( _
            VBuffer, 0, VertexPositionNormalColor.SizeInBytes)
    End Sub
    
    '...
    
    Protected Overrides Sub LoadContent()
        Shader = GetEffect(AppPath & "\SimpleShader.fx")
        LoadHeightMap(GetTexture(AppPath & "\HeightMap.bmp"))
        SetVertices()
        SetIndices()
        SetNormals()
        CopyToBuffer()

        ViewMatrix = Matrix.CreateLookAt( _
            New Vector3(70, 100, -70), _
            New Vector3(0, 0, 0), _
            New Vector3(0, 1, 0))

        ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView( _
            MathHelper.PiOver4, _
            Me.GraphicsDevice.Viewport.AspectRatio, _
            1, 500)

        MyBase.LoadContent()
    End Sub
    
    '...
    
    Protected Overrides Sub Draw(ByVal gameTime As GameTime)
        Me.Graphics.GraphicsDevice.Clear(Color.CornflowerBlue)

        Shader.CurrentTechnique = Shader.Techniques("ColoredPlus")

        Shader.Parameters("View").SetValue(ViewMatrix)
        Shader.Parameters("Projection").SetValue(ProjectionMatrix)
        Shader.Parameters("World").SetValue( _
            Matrix.CreateTranslation( _
            New Vector3(-TerrainWidth / 2, 0, TerrainLength / 2)) * _
            Matrix.CreateRotationY(Angle))

        Dim LightDirection As New Vector3(-0.27, 0.33, -0.86)
        LightDirection = Vector3.Transform(LightDirection, _
            Matrix.CreateRotationY(Angle))
        LightDirection.Normalize()
        Shader.Parameters("LightEnabled").SetValue(True)
        Shader.Parameters("LightDirection").SetValue(LightDirection)
        Shader.Parameters("AmbientFactor").SetValue(0.1F)


        Shader.Begin()
        For Each Pass As EffectPass In Shader.CurrentTechnique.Passes
            Pass.Begin()
            With Me.GraphicsDevice
                .VertexDeclaration = VDeclaration
                'Ora che tutti i dati sono già caricati
                'dentro il device, non c'è bisogno di
                'passarli al metodo di disegno. Dobbiamo solo
                'specificare offset e lunghezza, come facevamo
                'prima
                Me.GraphicsDevice.DrawIndexedPrimitives( _
                    PrimitiveType.TriangleList, 0, 0, _
                    Vertices.Length, 0, Indices.Length / 3)
            End With
            Pass.End()
        Next
        Shader.End()

        MyBase.Draw(gameTime)
    End Sub
End Class 
Non notere nessun cambiamento a prima vista, ma la vostra GPU vi ringrazierà!








 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.