Shader laden und debuggen
Übersicht

![]() |
GoodjeeBetreff: Shader laden und debuggen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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/ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group