Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[Code] glScreen + VBO & Shader ext.

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 13.11.2012, 06:15    Titel: [Code] glScreen + VBO & Shader ext. Antworten mit Zitat

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...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz