sur le forum anglais , tu y trouveras quelques exemples pour debuter les shaders sous opengl
utilise le bouton "load" pour charger un shader et le bouton "run" pour lancer un shader modifié
fais un copier/coller du shader dans un fichier txt , puis lance le avec le programme ci-dessous
Code : Tout sélectionner
;/ GLSL example to test new OpenGLGadget - PJ 06/2014.
;EnableExplicit
Global screen_lg = 1920
Global screen_ht = 1080
Structure shaders
file.s
name.s
EndStructure
Global NewList ShaderList.shaders()
Global shader$
Enumeration ;/ Window
#Window_Main
EndEnumeration
Enumeration ;/ Gadget
#Gad_OpenGL
#Gad_Editor
#Gad_ShaderSelector_Combo
EndEnumeration
Enumeration ; button
#run = 100
#load
#save
#exit
#test
EndEnumeration
Structure System
Width.i
Height.i
Shader_Width.i
Shader_Height.i
Event.i
Exit.i
MouseX.i
MouseY.i
App_CurrentTime.i
App_StartTime.i
Editor_LastText.s
Shader_Vertex_Text.s
Shader_Fragment_Text.s
Shader_Vertex.i
Shader_Fragment.i
Shader_Program.i
Shader_Uniform_Time.i
Shader_Uniform_Resolution.i
Shader_Uniform_Mouse.i
Shader_Uniform_SurfacePosition.i
FPS_Timer.i
Frames.i
FPS.i
EndStructure
Global System.System
Procedure LoadGLTextures(Names.s)
Protected *pointer, TextureID.i, FrameBufferID.i
LoadImage(0, Names) ; Load texture with name
*pointer = EncodeImage(0, #PB_ImagePlugin_BMP,0,24);
FreeImage(0)
; ----- Generate texture
glGenTextures_(1, @TextureID.i)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, 0, 3, PeekL(*pointer+18), PeekL(*pointer+22), 0, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *pointer+54);
FreeMemory(*pointer)
ProcedureReturn TextureID
EndProcedure
Procedure load_shader()
Protected filename$ ="" , t$
filename$ = OpenFileRequester("Open shader","","All|*.*",0)
If filename$ <> ""
If ReadFile(0,filename$)
shader$ = ""
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
shader$ = shader$ + ReadString(0) + Chr(10)
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
Debug "???"
EndIf
EndIf
EndProcedure
Procedure save_shader()
Protected filename$ ="" , r$ ,t$
filename$ = SaveFileRequester("Save shader", "", "", 0)
Debug filename$
Debug GetFilePart(filename$)
Debug GetPathPart(filename$)
Debug GetExtensionPart(filename$)
If filename$ <> ""
If OpenFile(0,filename$)
FileSeek(0, Lof(0))
r$ = ""
For i = 1 To Len(shader$)
t$ = Mid(shader$,i,1)
If t$ = Chr(13) Or t$ = Chr(10)
t$ = ""
WriteStringN(0,r$)
r$ = ""
Else
r$ = r$ + t$
EndIf
Next
CloseFile(0)
EndIf
EndIf
EndProcedure
;Procedure Init_Main()
System\Width.i = screen_lg
System\Height = screen_ht
System\Shader_Width = screen_lg / 2
System\Shader_Height = screen_ht
OpenWindow(#Window_Main,0,0,screen_lg,screen_ht,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenGLGadget(#Gad_OpenGL,screen_lg/2,0,System\Shader_Width,System\Shader_Height,#PB_OpenGL_Keyboard)
EditorGadget(#Gad_Editor,0,30,System\Width - (System\Shader_Width+8),System\Height-30)
ButtonGadget(#run,5 ,0,70,24,"run")
ButtonGadget(#save,105 ,0,70,24,"save")
ButtonGadget(#load,205 ,0,70,24,"load")
ButtonGadget(#exit,305 ,0,70,24,"exit")
ButtonGadget(#test,405 ,0,70,24,"test")
System\App_StartTime = ElapsedMilliseconds()
System\Shader_Vertex_Text = "#version 330"+Chr(10)
System\Shader_Vertex_Text + "in vec3 position;"+Chr(10)
System\Shader_Vertex_Text + " void main() {"+Chr(10)
System\Shader_Vertex_Text + " gl_Position = vec4( position, 1.0 );"+Chr(10)
System\Shader_Vertex_Text + " };"+Chr(10)
;EndProcedure
;Init_Main()
;{ Opengl shader setup & routines
#GL_VERTEX_SHADER = $8B31
#GL_FRAGMENT_SHADER = $8B30
;{ OpenGL
; https://www.purebasic.fr/english/viewtopic.php?p=576628#p576628
#GL_VERTEX_SHADER = $8B31
#GL_FRAGMENT_SHADER = $8B30
CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
ImportC "-framework OpenGL"
glCreateShader(type.l) As "_glCreateShader"
glCreateProgram() As "_glCreateProgram"
glDeleteShader(shader.l) As "_glDeleteShader"
glCompileShader(shader.l) As "_glCompileShader"
glLinkProgram(shader.l) As "_glLinkProgram"
glUseProgram(shader.l) As "_glUseProgram"
glAttachShader(Program.l, shader.l) As "_glAttachShader"
glShaderSource(shader.l, numOfStrings.l, *strings, *lenOfStrings) As "_glShaderSource"
glGetUniformLocation(Program.i, name.p-ascii) As "_glGetUniformLocation"
glUniform1i(location.i, v0.i) As "_glUniform1i"
glUniform2i(location.i, v0.i, v1.i) As "_glUniform2i"
glUniform1f(location.i, v0.f) As "_glUniform1f"
glUniform1d(location.i, v0.d) As "_glUniform1d"
glUniform2f(location.i, v0.f, v1.f) As "_glUniform2f"
glUniform2d(location.i, v0.d, v1.d) As "_glUniform2d"
glGetShaderInfoLog(shader.i, bufSize.l, *length_l, *infoLog) As "_glGetShaderInfoLog"
EndImport
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
ImportC "/usr/lib/x86_64-linux-gnu/libGL.so"
glCreateShader(type.l)
glCreateProgram()
glDeleteShader(shader.l)
glCompileShader(shader.l)
glLinkProgram(shader.l)
glUseProgram(shader.l)
glAttachShader(Program.l, shader.l)
glShaderSource(shader.l, numOfStrings.l, *strings, *lenOfStrings) :
glGetUniformLocation(Program.i, name.p-ascii)
glUniform1i(location.i, v0.i)
glUniform2i(location.i, v0.i, v1.i)
glUniform1f(location.i, v0.f)
glUniform1d(location.i, v0.d)
glUniform2f(location.i, v0.f, v1.f)
glUniform2d(location.i, v0.d, v1.d)
glGetShaderInfoLog(shader.i, bufSize.l, *length_l, *infoLog)
EndImport
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
Prototype glCreateShader(type.l)
Prototype glCreateProgram()
Prototype glDeleteShader(shader.l)
Prototype glCompileShader(shader.l)
Prototype glLinkProgram(shader.l)
Prototype glUseProgram(shader.l)
Prototype glAttachShader(Program.l, shader.l)
Prototype glShaderSource(shader.l, numOfStrings.l, *strings, *lenOfStrings) :
Prototype glGetUniformLocation(Program.i, name.p-ascii)
Prototype glUniform1i(location.i, v0.i)
Prototype glUniform2i(location.i, v0.i, v1.i)
Prototype glUniform1f(location.i, v0.f)
Prototype glUniform1d(location.i, v0.d)
Prototype glUniform2f(location.i, v0.f, v1.f)
Prototype glUniform2d(location.i, v0.d, v1.d)
Prototype glGetShaderInfoLog(shader.i, bufSize.l, *length_l, *infoLog)
Global glCreateShader.glCreateShader = wglGetProcAddress_("glCreateShader")
Global glCreateProgram.glCreateProgram = wglGetProcAddress_("glCreateProgram")
Global glDeleteShader.glDeleteShader = wglGetProcAddress_("glDeleteShader")
Global glCompileShader.glCompileShader = wglGetProcAddress_("glCompileShader")
Global glLinkProgram.glLinkProgram = wglGetProcAddress_("glLinkProgram")
Global glUseProgram.glUseProgram = wglGetProcAddress_("glUseProgram")
Global glAttachShader.glAttachShader = wglGetProcAddress_("glAttachShader")
Global glShaderSource.glShaderSource = wglGetProcAddress_("glShaderSource")
Global glGetUniformLocation.glGetUniformLocation = wglGetProcAddress_("glGetUniformLocation")
Global glUniform1i.glUniform1i = wglGetProcAddress_("glUniform1i")
Global glUniform2i.glUniform2i = wglGetProcAddress_("glUniform2i")
Global glUniform1f.glUniform1f = wglGetProcAddress_("glUniform1f")
Global glUniform1d.glUniform1d = wglGetProcAddress_("glUniform1d")
Global glUniform2f.glUniform2f = wglGetProcAddress_("glUniform2f")
Global glUniform2d.glUniform2d = wglGetProcAddress_("glUniform2d")
Global glGetShaderInfoLog.glGetShaderInfoLog = wglGetProcAddress_("glGetShaderInfoLog")
CompilerEndIf
;}
Procedure Shader_Compile_Link_Use(Vertex.s,Fragment.s,Use.i=1)
Protected VertShader.i, FragShader.i, *TxtPointer, Program.i
Protected Textlength.i, Mytext.s = Space(1024)
;/ Compile Vertex shader
VertShader.i = glCreateShader(#GL_VERTEX_SHADER)
*TxtPointer = Ascii(Vertex)
glShaderSource(VertShader, 1, @*TxtPointer, #Null)
glCompileShader(VertShader)
glGetShaderInfoLog(VertShader,1023,@Textlength,@Mytext)
;/ Compile Fragment Shader
FragShader.i = glCreateShader(#GL_FRAGMENT_SHADER)
*TxtPointer = Ascii(Fragment)
glShaderSource(FragShader, 1, @*TxtPointer, #Null)
glCompileShader(FragShader)
glGetShaderInfoLog(FragShader,1023,@Textlength,@Mytext)
;Debug PeekS(@Mytext,1023,#PB_Ascii)
;Debug MyText
;/ Create Shader Program
Program = glCreateProgram()
glAttachShader(Program,VertShader)
glAttachShader(Program,FragShader)
glLinkProgram(Program)
If Use = 1 : glUseProgram(Program) : EndIf
ProcedureReturn Program
EndProcedure
;}
Procedure Shader_Set()
If System\Shader_Program <> 0 :glUseProgram(0) : EndIf ;/ delete the previous shaders
System\Shader_Fragment_Text = shader$
System\Shader_Program = Shader_Compile_Link_Use(System\Shader_Vertex_Text,System\Shader_Fragment_Text)
If System\Shader_Program = 0
MessageRequester("Unsupported Device?","No Shader Support Available",#PB_MessageRequester_Ok)
End
EndIf
;/ store shader uniform locations
System\Shader_Uniform_Time = glGetUniformLocation(System\Shader_Program, "time")
System\Shader_Uniform_Mouse = glGetUniformLocation(System\Shader_Program, "mouse")
System\Shader_Uniform_Resolution = glGetUniformLocation(System\Shader_Program, "resolution")
System\Shader_Uniform_SurfacePosition.i = glGetUniformLocation(System\Shader_Program, "surfacePosition")
SetGadgetText(#Gad_Editor,shader$)
EndProcedure
Procedure Render()
;/ set shader Uniform values
glUniform2f(System\Shader_Uniform_Resolution,System\Shader_Width,System\Shader_Height)
glUniform1f(System\Shader_Uniform_Time,(System\App_CurrentTime-System\App_StartTime) / 1000.0)
glUniform2i(System\Shader_Uniform_SurfacePosition.i,1.0,1.0)
glBegin_(#GL_QUADS)
glVertex2f_(-1,-1)
glVertex2f_( 1,-1)
glVertex2f_( 1, 1)
glVertex2f_(-1, 1)
glEnd_()
System\Frames + 1
If System\App_CurrentTime > System\FPS_Timer
System\FPS = System\Frames
System\Frames = 0
System\FPS_Timer = System\App_CurrentTime + 1000
SetWindowTitle(#Window_Main,"GLSL Testing - PJ 07/06/2014 - FPS: "+Str(System\FPS))
EndIf
SetGadgetAttribute(#Gad_OpenGL,#PB_OpenGL_FlipBuffers,1)
EndProcedure
Repeat
Repeat
System\Event = WindowEvent()
Select System\Event
Case #PB_Event_CloseWindow
System\Exit = #True
Case #PB_Event_Gadget
Select EventGadget()
Case #load
load_shader()
Shader_Set()
Case #run
shader$ = GetGadgetText(#Gad_Editor)
Shader_Set()
Case #save
save_shader()
Case #exit
End
Case #test
Case #Gad_OpenGL
Select EventType()
Case #PB_EventType_MouseMove
System\MouseX = GetGadgetAttribute(#Gad_OpenGL,#PB_OpenGL_MouseX)
System\MouseY = GetGadgetAttribute(#Gad_OpenGL,#PB_OpenGL_MouseY)
;glUniform2f(System\Shader_Uniform_Mouse,System\MouseX / System\Shader_Width,(System\Shader_Height-System\MouseY) / System\Shader_Height)
EndSelect
EndSelect
EndSelect
Until System\Event = 0
System\App_CurrentTime = ElapsedMilliseconds()
Render()
Until System\Exit
End
voici quelques exemples de shader , fais un copier/coller dans un fichier "txt" puis charger les avec le bouton "load"