| Eternal_pain 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1783
 Wohnort: BW/KA
 
 | 
			
				|  Verfasst am: 13.11.2012, 06:15    Titel: [Code] glScreen + VBO & Shader ext. |   |  
				| 
 |  
				| Hab das hier im englischen Forum gefunden und finde ist ein sehr hilfreiches und gelungenes Code-Beispiel zum initiieren eines OpenGL Screens unter FreeBASIC mit zusätzlichen Extensions zum nutzen von VBO und GLSL. 
 Quelle: http://www.freebasic.net/forum/viewtopic.php?f=7&t=20600
 
 
  	  | Code: |  	  | #ifndef __GLSCREEN_BI__
 #define __GLSCREEN_BI__
 
 #include once "fbgfx.bi"
 #include once "GL/gl.bi"
 #include once "GL/glext.bi"
 
 
 #ifdef USE_DPRINT
 #define dprint(msg) open err for output as #99 : print  #99,msg : close #99 :
 #else
 #define dprint(msg) :
 #endif
 
 
 type VIDEOMODE
 as integer w,h,b,s,f ' width,height,bits,size,fullscreen
 end type
 
 type PVIDEOMODE  as VIDEOMODE  ptr
 
 type VideoModes
 declare constructor
 declare destructor
 declare sub Fit(byref w as integer, _
 byref h as integer, _
 byref b as integer, _
 byref f as integer)
 as VIDEOMODE      Desktop
 as VIDEOMODE      Current
 as PVIDEOMODE ptr p15,p16,p24,p32
 as integer        n15,n16,n24,n32
 end type
 
 #macro GETMODES(X)
 Mode = ScreenList(X)
 if Mode then
 dprint("modes with " & #X & " bits:")
 
 While (Mode <> 0)
 ' expand the list for one member
 p##X = reallocate(p##X,(n##X+1)*sizeof(PVIDEOMODE))
 ' allocate item
 p##X[n##X] = allocate(sizeof(VIDEOMODE))
 p##X[n##X]->w = HiWord(Mode)
 p##X[n##X]->h = LoWord(Mode)
 p##X[n##X]->s = p##X[n##X]->w*p##X[n##X]->h
 p##X[n##X]->b = X
 dprint("mode: " & p##X[n##X]->w & " x " & p##X[n##X]->h & " x " & p##X[n##X]->b)
 n##X+=1
 Mode = ScreenList()
 wend
 dprint("")
 end if
 #endmacro
 
 #macro FREEMODES(X)
 if p##X then
 while n##X
 n##X-=1: if p##X[n##X] then deallocate p##X[n##X]
 wend
 deallocate p##X
 end if
 #endmacro
 
 constructor VideoModes
 dim as integer Mode
 dprint("VideoModes()")
 With DeskTop
 dprint("")
 ScreenInfo .w,.h,.b
 .s = .w * .h
 dprint("Desktop " & .w & " x " & .h  & " x " & .b)
 dprint("")
 end with
 
 GETMODES(15)
 GETMODES(16)
 GETMODES(24)
 GETMODES(32)
 end constructor
 
 destructor VideoModes
 dprint("VideoModes~")
 FREEMODES(15)
 FREEMODES(16)
 FREEMODES(24)
 FREEMODES(32)
 end destructor
 
 ' get nearest video mode params
 sub VideoModes.Fit(byref w as integer, _
 byref h as integer, _
 byref b as integer, _
 byref f as integer)
 dim as integer size = w*h
 
 if b=32 andalso p32=0 then b=24
 if b=24 andalso p24=0 then b=16
 if b=16 andalso p16=0 then b=15
 
 if size>Desktop.s then f=1
 ' no fullscreen
 if f=0 then return
 
 dim as PVIDEOMODE ptr pList
 dim as integer        nModes
 select case b
 case 15 : pList = p15 : nModes = n15
 case 16 : pList = p16 : nModes = n16
 case 24 : pList = p24 : nModes = n24
 case 32 : pList = p32 : nModes = n32
 end select
 
 ' search a fullscreen mode
 dim as integer diff = size
 dim as integer indx = -1
 for i as integer = 0 to nModes-1
 if abs(pList[i]->s - size)<diff then
 indx=i:diff=abs(pList[i]->s - size)
 end if
 next
 w=pList[indx]->w
 h=pList[indx]->h
 end sub
 
 dim shared as VideoModes Modes
 
 ' define OpenGL proc
 #define glDef(n) dim shared as PFN##n##PROC n
 ' get OpenGL proc (abort if something goes wrong)
 #define glProc(n) n = ScreenGLProc(#n) : if n = 0 then screen 0 : ? "error: " & #n : sleep: end
 
 ' VBO
 glDef(glBindBuffer)
 glDef(glDeleteBuffers)
 glDef(glGenBuffers)
 glDef(glIsBuffer)
 glDef(glBufferData)
 glDef(glBufferSubData)
 glDef(glGetBufferSubData)
 glDef(glMapBuffer)
 glDef(glUnmapBuffer)
 glDef(glGetBufferParameteriv)
 glDef(glGetBufferPointerv)
 
 ' Shader
 glDef(glCreateProgram)
 glDef(glDeleteProgram)
 glDef(glCreateShader)
 glDef(glDeleteShader)
 glDef(glCompileShader)
 glDef(glIsProgram)
 glDef(glIsShader)
 glDef(glShaderSource)
 glDef(glGetShaderInfoLog)
 glDef(glGetShaderiv)
 glDef(glAttachShader)
 glDef(glDetachShader)
 glDef(glLinkProgram)
 glDef(glUseProgram)
 
 sub glScreen(w as integer=800, h as integer=600, b as integer=32, d as integer=16, s as integer=8, f as integer=0)
 if ScreenPtr() then screen 0
 
 dprint("wish: " & w & " x " & h & " x " & b  & " fullscreen " & f)
 
 dim as integer minW = iif(f<>0,640,320)
 dim as integer minH = iif(f<>0,480,200)
 
 if w<minW then w=minW
 if h<minH then h=minH
 
 if b<16 then
 b=15
 elseif b<24 then
 b=16
 elseif b<32 then
 b=24
 else
 b=32
 end if
 
 if d<8 then
 d=0
 elseif d<16 then
 d=8
 elseif d<24 then
 d=16
 elseif d<32 then
 d=24
 else
 d=32
 end if
 
 if s<1 then
 s=0
 elseif s<8 then
 s=1
 elseif s<16 then
 s=8
 else
 s=16
 end if
 
 Modes.Fit(w,h,b,f)
 
 dprint("fit: " & w & " x " & h & " x " & b & " fullscreen " & f)
 
 if s then ScreenControl FB.SET_GL_STENCIL_BITS,s
 if d then ScreenControl FB.SET_GL_DEPTH_BITS,d
 ScreenRes w,h,b,,FB.GFX_OPENGL or iif(f<>0,FB.GFX_FULLSCREEN,0)
 flip
 with Modes.Current
 ScreenInfo .w,.h,.b
 .f = iif(f<>0,1,0)
 dprint("final: " & .w & " x " & .h & " x " & .b & " fullscreen " & .f)
 end with
 
 ' VBO
 glProc(glBindBuffer)
 glProc(glDeleteBuffers)
 glProc(glGenBuffers)
 glProc(glIsBuffer)
 glProc(glBufferData)
 glProc(glBufferSubData)
 glProc(glGetBufferSubData)
 glProc(glMapBuffer)
 glProc(glUnmapBuffer)
 glProc(glGetBufferParameteriv)
 glProc(glGetBufferPointerv)
 ' shader
 glProc(glCreateProgram)
 glProc(glDeleteProgram)
 glProc(glCreateShader)
 glProc(glDeleteShader)
 glProc(glCompileShader)
 glProc(glIsProgram)
 glProc(glIsShader)
 glProc(glShaderSource)
 glProc(glGetShaderInfoLog)
 glProc(glGetShaderiv)
 glProc(glAttachShader)
 glProc(glDetachShader)
 glProc(glLinkProgram)
 glProc(glUseProgram)
 end sub
 
 #endif ' __GLSCREEN_BI__
 
 | 
 
 Ganz besonders praktisch und gut finde ich persönlich die folgenden zwei Macros zum deklarieren der Extensions...
 
 
  	  | Code: |  	  | ' define OpenGL proc
 #define glDef(n) dim shared as PFN##n##PROC n
 ' get OpenGL proc (abort if something goes wrong)
 #define glProc(n) n = ScreenGLProc(#n) : if n = 0 then screen 0 : ? "error: " & #n : sleep: end
 
 | 
 
 Dachte mir das deutsche Forum das selten bis gar nicht im englischen Forum unterwegs ist hat so auch was davon...
 _________________
 
  |  |