the source is too big to be post here
download: http://demo.ovh.com/en/c08cf4fe380f4738 ... a62d416de/
a example with shaders (included in the archive)
Code: Select all
; *---------------------------------*
; * OpenGL Base Example *
; * xorc1zt *
; * 2011 *
; *---------------------------------*
EnableExplicit
IncludeFile "glbase.pb"
Global quitmainloop.b = #False
Global viewmatrix.MATRIX
Global projmatrix.MATRIX
Global program_id.i
;- Declarations
Declare tickWindow()
Declare onResize( height.i, width.i )
Declare onRender()
Declare onInit()
;- Start
openGLWindow( 100, 100, 800, 600, "Hello OpenGL" )
onInit()
;- Main loop
Repeat
onRender()
FlipBuffers()
tickWindow()
Until quitmainloop
;- Procedures
Procedure tickWindow()
Select WindowEvent()
Case #PB_Event_CloseWindow
quitmainloop = #True
Case #PB_Event_SizeWindow
onResize( WindowWidth(0), WindowHeight(0) )
EndSelect
EndProcedure
Procedure onResize( width.i, height.i)
Debug Str(width)+"x"+Str(height)
glViewport( 0, 0, width, height )
projmatrix\perspective( 70, 1, 100, width/height )
EndProcedure
Procedure onRender()
Define vertex_location.i
Define color_location.i
Static angle.f
glClearScreen( 0.2, 0.2, 0.2)
angle + 1.0
vertex_location = glGetAttribLocation( program_id, "in_Vertex" )
glVertexAttribPointer( vertex_location, 3, #GL_FLOAT, #GL_FALSE, 0, ?cubevertex )
glEnableVertexAttribArray( vertex_location )
color_location = glGetAttribLocation( program_id, "in_Color" )
glVertexAttribPointer( color_location, 3, #GL_FLOAT, #GL_FALSE, 0, ?cubecolor )
glEnableVertexAttribArray( color_location )
glUseProgram( program_id )
glUniformMatrix4fv( glGetUniformLocation( program_id, "projection" ), 1, #GL_FALSE, projmatrix\getAddress() )
viewmatrix\identity()
viewmatrix\lookAt( 0, 3, 8, 0, 0, 0, 0, 1, 0)
viewmatrix\push()
viewmatrix\rotateZ(angle)
glUniformMatrix4fv( glGetUniformLocation( program_id, "modelview" ), 1, #GL_FALSE, viewmatrix\getAddress() )
glDrawArrays( #GL_TRIANGLES, 0, 36 )
viewmatrix\pop()
viewmatrix\push()
viewmatrix\translate(-3,0,0)
viewmatrix\rotateY(angle)
glUniformMatrix4fv( glGetUniformLocation( program_id, "modelview" ), 1, #GL_FALSE, viewmatrix\getAddress() )
glDrawArrays( #GL_TRIANGLES, 0, 36 )
viewmatrix\pop()
viewmatrix\push()
viewmatrix\translate(3,0,0)
viewmatrix\rotateX(angle)
glUniformMatrix4fv( glGetUniformLocation( program_id, "modelview" ), 1, #GL_FALSE, viewmatrix\getAddress() )
glDrawArrays( #GL_TRIANGLES, 0, 36 )
viewmatrix\pop()
glUseProgram( 0 )
glDisableVertexAttribArray( vertex_location )
glDisableVertexAttribArray( color_location )
EndProcedure
Procedure onInit()
Define vertex_shader.s
Define fragment_shader.s
viewmatrix = createMatrix("viewmatrix")
projmatrix = createMatrix("projmatrix")
;vertex shader source code
vertex_shader = "#version 330"+#CRLF$
vertex_shader + "in vec3 in_Vertex;"+#CRLF$
vertex_shader + "in vec3 in_Color;"+#CRLF$
vertex_shader + "out vec3 color;"+#CRLF$
vertex_shader + "uniform mat4 projection;"+#CRLF$
vertex_shader + "uniform mat4 modelview;"+#CRLF$
vertex_shader + "void main()"+#CRLF$
vertex_shader + "{"+#CRLF$
vertex_shader + "gl_Position = projection * modelview * vec4(in_Vertex, 1.0);"+#CRLF$
vertex_shader + "color = in_Color;"+#CRLF$
vertex_shader + "}"
;fragment shader source code
fragment_shader = "#version 330"+#CRLF$
fragment_shader + "in vec3 color;"+#CRLF$
fragment_shader + "out vec4 out_Color;"+#CRLF$
fragment_shader + "void main()"+#CRLF$
fragment_shader + "{"+#CRLF$
fragment_shader + "out_Color = vec4(color, 1.0);"+#CRLF$
fragment_shader + "}"
program_id = createProgramFast(vertex_shader, fragment_shader)
EndProcedure
DataSection
cubecolor:
cubevertex:
Data.f 1.0, 1.0,-1.0; north
Data.f -1.0,-1.0,-1.0
Data.f -1.0, 1.0,-1.0
Data.f 1.0, 1.0,-1.0
Data.f 1.0,-1.0,-1.0
Data.f -1.0,-1.0,-1.0
Data.f -1.0,-1.0,-1.0; west
Data.f -1.0,-1.0, 1.0
Data.f -1.0, 1.0, 1.0
Data.f -1.0,-1.0,-1.0
Data.f -1.0, 1.0, 1.0
Data.f -1.0, 1.0,-1.0
Data.f 1.0, 1.0, 1.0; east
Data.f 1.0,-1.0,-1.0
Data.f 1.0, 1.0,-1.0
Data.f 1.0,-1.0,-1.0
Data.f 1.0, 1.0, 1.0
Data.f 1.0,-1.0, 1.0
Data.f -1.0, 1.0, 1.0; south
Data.f -1.0,-1.0, 1.0
Data.f 1.0,-1.0, 1.0
Data.f 1.0, 1.0, 1.0
Data.f -1.0, 1.0, 1.0
Data.f 1.0,-1.0, 1.0
Data.f 1.0, 1.0, 1.0; top
Data.f 1.0, 1.0,-1.0
Data.f -1.0, 1.0,-1.0
Data.f 1.0, 1.0, 1.0
Data.f -1.0, 1.0,-1.0
Data.f -1.0, 1.0, 1.0
Data.f 1.0,-1.0, 1.0; bot
Data.f -1.0,-1.0, 1.0
Data.f -1.0,-1.0,-1.0
Data.f -1.0,-1.0,-1.0
Data.f 1.0,-1.0,-1.0
Data.f 1.0,-1.0, 1.0
EndDataSection
openGLWindow(posX.i, posY.i, width.i, height.i, title.s)
- init opengl and open a window
loadShader(type.l, source.s, sourcetype.b=0)
- load a shader and return the opengl id. if sourcetype is set on true the shader is load from a file
ex: loadShader( #GL_VERTEX_SHADER, "shaders\vertex_shader.txt" , #True )
createProgram( vertexshaderID.i, fragmentshaderID.i )
- create a program, link the shaders and return the opengl id
createProgramFast(vertex_shader.s, fragment_shader.s, sourcetype.b=0)
- loadshader + createprogram combo (shaders are automatically deleted).
the matrix stuffs is included too (http://www.purebasic.fr/english/viewtop ... 16&t=48613)
set #TRACEFUNCTION to false to turn off the debug tracing
you can start the application with the launch command "-eraselog" to erase the log file