Shader laden und debuggen

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Goodjee

Betreff: Shader laden und debuggen

BeitragSo, Dez 21, 2008 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
heyho,
in den letzten tagen habe ich mich ein bischen mit shadern befasst und nun möchte ich euch meine ergebnisse nicht vorenthalten, da ich denke dass sie für andere, die mit shadern anfangen möchten hilfreich sein könnten.

Und zwar habe ich eine funktion geschrieben, die einen Vertex und einen Fragmentshader läd und ein ProgrammObject zurückliefert, welches man einfach aktivieren kann und schon kann man seine shader testen.
Das ganze funktioniert zum Beispiel in Kombination mit MiniB3d sehr gut, einfach den shader vor dem renderworld aktivieren. Allerdings wird er dann auf alle Objekte angewendet. Aber Minib3d ist ja opensource Wink Oder man schreibt sich schnell ein kleines gl-Testprogramm.

Man muss folgende Frameworks aktivieren:
-pub.glew
-pub.opengl

edit: außerdem muss man einmal initGlew() aufrufen

Code: [AUSKLAPPEN]

Function loadShader:Int(file:String, file2:String)
   Local ProgramObject:Int
   Local VertexShaderObject :Int '  : GLhandleARB;
   Local FragmentShaderObject : Int 'GLhandleARB;

   ProgramObject=glCreateProgramObjectARB()
   VertexShaderObject   = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
   FragmentShaderObject = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
   
   Local fileStream:TStream=OpenFile(file)
   Local fileStream2:TStream=OpenFile(file2)
   
   Local shaderSrcVertex:Byte[FileSize(file)+1]
   Local i:Int=0
   While Not Eof(fileStream)
      shaderSrcVertex[i] = ReadByte(fileStream)
      i:+1
      If i>FileSize(file) Then i = FileSize(file)
   Wend
   CloseFile(fileStream)
   
   Local pointer:Byte Ptr = Varptr shadersrcVertex[0]
   Local laenge:Int=FileSize(file)
   
   glShaderSourceARB(VertexShaderObject,1,Varptr pointer,Varptr laenge)
   glCompileShaderARB(VertexShaderObject)
   
   debugShader(VertexShaderObject)
      
   Local shaderSrcFragment:Byte[FileSize(file2)+1]
   i=0
   While Not Eof(fileStream2)
      shaderSrcFragment[i] = ReadByte(fileStream2)
      i:+1
      If i>FileSize(file2) Then i = FileSize(file2)
   Wend
   CloseFile(fileStream2)
   
   pointer = Varptr shadersrcFragment[0]
   laenge=FileSize(file2)
   
   glShaderSourceARB(FragmentShaderObject,1,Varptr pointer,Varptr laenge)
   glCompileShaderARB(FragmentShaderObject)
   
   debugShader(FragmentShaderObject)

   
   
   glAttachObjectARB(ProgramObject, VertexShaderObject)
   glAttachObjectARB(ProgramObject, FragmentShaderObject)

   glDeleteObjectARB(VertexShaderObject)
   glDeleteObjectARB(FragmentShaderObject)

   glLinkProgramARB(ProgramObject);
   
   Return ProgramObject
End Function

Function debugShader(shaderObject:Int)
   Local laengedeslogs:Float
   glGetObjectParameterfvARB(shaderObject,GL_OBJECT_INFO_LOG_LENGTH_ARB,Varptr laengedeslogs)


   Local bytearray:Byte[]=New Byte[laengedeslogs]
   Local laenge23:Int=0
   glGetInfoLogARB(shaderObject, laengedeslogs, Varptr(laenge23), Varptr(bytearray[0]));
   Local msg:String=""
   For Local j:Int=0 To laengedeslogs-1
      msg=msg+ Chr(bytearray[j])
   Next
   DebugLog "ShaderLog: "+msg
End Function



Aktivieren kann man den shader jetzt mit
Code: [AUSKLAPPEN]
glUseProgramObjectARB(ProgramObject)


und deaktivieren mit

Code: [AUSKLAPPEN]
glUseProgramObjectARB(0)



Um die shadersprache glsl zu lernen empfehle ich folgendes tutorial: http://wiki.delphigl.com/index.php/Tutorial_glsl


Vieleicht hilft es es ja wem
Mfg
Goodjee
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group