'Il compito della prossima sezione di codice è di ridimensionare la scena OpenGL ogni volta che la
' finestra (dando per scontato che state utilizzando una finestra piuttosto che la modalità fullscreen)
' viene ridimensionata. Persino se non c'è la possibilità di ridimensionare la finestra (per esempio, si
' è in modalità fullscreen), questa routine verrà chiamata almeno una volta quando il programma
' parte per settare la visuale prospettica. La scena OpenGL verrà ridimensionata basandosi sulla
' larghezza e l'altezza della finestra in cui viene visualizzata.
'Definiamo due variabili , ratio che indica il rapporto tra larghezza e l' altezza della finestra e
'Height che indica l' altezza della stessa
DIM ratio AS Float
DIM Height AS Integer
Height = Screen.Height
IF Height = 0 THEN Height = 1
ratio = Screen.Width / Height
Gl.Viewport(0, 0, Screen.Width, Screen.Height)
'Le linee seguenti impostano lo schermo per una visuale prospettica. Ciò significa che le cose più
' sono distanti più diventano piccole. Questo crea una scena dall'aspetto realistico. La prospettiva
' viene calcolata con un angolo di osservazione di 45° basato sull'altezza e la larghezza della
' finestra. 0.1, 100.0 sono il punto di partenza e di arrivo di quanto in profondità è possibile
' disegnare nello schermo.
Gl.MatrixMode(gl.GL_PROJECTION)
Gl.LoadIdentity()
Glu.Perspective(45.0, ratio, 0.1, 100.0)
'glMatrixMode(GL_PROJECTION) indica che le 2 linee successive del codice influiranno sulla
' matrice di proiezione. La matrice prospettica si occupa di aggiungere la prospettiva alla nostra
' scena. glLoadIdentity() è simile ad un reset. Ripristina lo stato di partenza nella matrice
' selezionata. Dopo che glLoadIdentity() è stata chiamata, staabiliamo la visuale prospettica per la
' scena. glMatrixMode(GL_MODELVIEW) indica che ogni nuova trasformazione influirà sulla
' matrice di visualizzazione del modello. La matrice di visualizzazione del modello è dove vengono
' memorizzate le informazioni riguardanti il nostro oggetto. Infine azzeriamo la matrice di
' visualizzazione del modello. Non preoccupatevi se non capite questa parte, la rispiegherò in un
' altro tutorial. Sappiate solo che questo DEVE essere fatto per una buona scena prospettica.
Gl.MatrixMode(gl.GL_MODELVIEW)
GL.LoadIdentity()
'ed infine chiudiamo la funzionerà
END
' Gambas module file
PRIVATE CONST ScrWidth AS Integer = 640
PRIVATE CONST ScrHeight AS Integer = 480
PRIVATE Screen AS NEW Window(TRUE) AS "Screen"
PUBLIC SUB Main()
screen.Width = ScrWidth
screen.Height = ScrHeight
Screen.show()
Screen.Border = Screen.Resizable
InitGL()
END
PUBLIC SUB InitGL()
Gl.ShadeModel(gl.GL_SMOOTH)
Gl.ClearColor(0.0, 0.0, 0.0, 1.0)
Gl.Clear(gl.GL_COLOR_BUFFER_BIT AND gl.GL_DEPTH_BUFFER_BIT)
Gl.ClearDepth(1.0)
Gl.Enable(gl.GL_DEPTH_TEST)
Gl.DepthFunc(gl.GL_LEQUAL)
Gl.Hint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST)
END
PUBLIC SUB screen_resize()
DIM ratio AS Float
DIM Height AS Integer
Height = Screen.Height
IF Height = 0 THEN Height = 1
ratio = Screen.Width / Height
Gl.Viewport(0, 0, Screen.Width, Screen.Height)
Gl.MatrixMode(gl.GL_PROJECTION)
Gl.LoadIdentity()
Glu.Perspective(45.0, ratio, 0.1, 100.0)
Gl.MatrixMode(gl.GL_MODELVIEW)
GL.LoadIdentity()
END
PUBLIC SUB Screen_draw()
gl.ClearColor(0, 0, 0, 1)
Gl.Clear(gl.GL_COLOR_BUFFER_BIT AND gl.GL_DEPTH_BUFFER_BIT)
Gl.LoadIdentity()
Gl.Translatef(-1.5, 0.0, -6.0)
gl.Begin(gl.GL_TRIANGLES)
gl.Vertex3f(0.0, 1.0, 0.0)
gl.Vertex3f(-1.0, -1.0, 0.0)
gl.Vertex3f(1.0, -1.0, 0.0)
gl.End
Gl.Translatef(3.0, 0.0, 0.0)
gl.Begin(gl.GL_QUADS)
gl.Vertex3f(-1.0, 1.0, 0.0)
gl.Vertex3f(1.0, 1.0, 0.0)
gl.Vertex3f(1.0, -1.0, 0.0)
gl.Vertex3f(-1.0, -1.0, 0.0)
gl.End
WAIT 0.01
END
PUBLIC SUB Screen_keyPress()
IF key.Code = key.F1 THEN Screen.Fullscreen = NOT Screen.Fullscreen
IF key.Code = key.Esc THEN Screen.Close()
END
1482 frames in 5.0 seconds = 296.369 FPS
1682 frames in 5.0 seconds = 336.393 FPS
1535 frames in 5.0 seconds = 306.852 FPS
1591 frames in 5.0 seconds = 318.148 FPS
1682 frames in 5.0 seconds = 336.392 FPS