ich habe dieses Beispiel im Forum gefunden:
Code: Alles auswählen
;/ GLSL example to test new OpenGLGadget - PJ 06/2014.
;EnableExplicit
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
CompilerIf Subsystem("OpenGL") = #False
MessageRequester("Error", "Please set the Library subsystem to OpenGL from IDE : Compiler... Compiler Options")
End
CompilerEndIf
CompilerEndIf
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Import ""
glXGetProcAddress(s.p-ascii) As "glXGetProcAddress"
EndImport
CompilerCase #PB_OS_Windows
CompilerIf (#PB_Compiler_Processor = #PB_Processor_x86)
Import "opengl32.lib"
wglGetProcAddress(s.p-ascii) As "_wglGetProcAddress@4"
EndImport
CompilerElse
Import "opengl32.lib"
wglGetProcAddress(s.p-ascii) As "wglGetProcAddress"
EndImport
CompilerEndIf
CompilerDefault
CompilerError "Unsupported OS"
CompilerEndSelect
Enumeration ;/ Window
#Window_Main
EndEnumeration
Enumeration ;/ Gadget
#Gad_OpenGL
#Gad_Editor
#Gad_ShaderSelector_Combo
EndEnumeration
Enumeration ;/ Menu
#Menu_Open
#Menu_Save
#Menu_Run
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 Init_Main()
Protected MyLoop.i
System\Width.i = 1024
System\Height = 480
System\Shader_Width = 640
System\Shader_Height = 480
OpenWindow(#Window_Main,0,0,System\Width, System\Height,"",#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#Window_Main), 0, 0, WindowWidth(#Window_Main)-170, WindowHeight(#Window_Main), 0, 0, 0)
CreateCamera(1, 0, 0, 100, 100)
MoveCamera(1, -100, 120, 190, #PB_Absolute)
CameraLookAt(1, 0, 0, 0)
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 90, 60, 0, #PB_Absolute)
CameraLookAt(0, 0, 0, 0)
CameraFOV(0, 80)
CameraProjectionMode(0, #PB_Camera_Perspective)
;Miroir
;CreateRenderTexture(1, CameraID(0), 800, 600)
CreateRenderTexture(1, CameraID(0), CameraViewWidth(0), CameraViewHeight(0), #PB_Texture_AutomaticUpdate)
CreateMaterial(1, TextureID(1))
If CreateMenu(0, WindowID(#Window_Main))
MenuTitle("File")
MenuItem(#Menu_Open,"Open")
MenuItem(#Menu_Save,"Save")
MenuBar()
MenuItem(#Menu_Run,"Run Shader")
EndIf
;OpenGLGadget(#Gad_OpenGL,0,0,System\Shader_Width,System\Shader_Height,#PB_OpenGL_Keyboard)
ComboBoxGadget(#Gad_ShaderSelector_Combo,System\Shader_Width+4,2,System\Width - (System\Shader_Width+8),24)
AddGadgetItem(#Gad_ShaderSelector_Combo,-1,"Shader: "+Str(1))
;SetGadgetState(#Gad_ShaderSelector_Combo,0)
EditorGadget(#Gad_Editor,System\Shader_Width+4,30,System\Width - (System\Shader_Width+8),System\Height-30)
System\App_StartTime = ElapsedMilliseconds()
System\Shader_Vertex_Text = "attribute vec3 position;"
System\Shader_Vertex_Text + "attribute vec2 surfacePosAttrib;"
System\Shader_Vertex_Text + "varying vec2 surfacePosition;"
System\Shader_Vertex_Text + " void main() {"
System\Shader_Vertex_Text + " surfacePosition = surfacePosAttrib;"
System\Shader_Vertex_Text + " gl_Position = vec4( position, 1.0 );"
System\Shader_Vertex_Text + " }"
EndProcedure
Init_Main()
;{ Opengl shader setup & routines
#GL_VERTEX_SHADER = $8B31
#GL_FRAGMENT_SHADER = $8B30
Prototype glCreateShader(type.l)
Prototype glCreateProgram()
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.i glGetUniformLocation(Program.i, name.s)
Prototype glUniform1i(location.i, v0.i)
Prototype glUniform2i(location.i, v0.i, v1.i)
Prototype glUniform1f(location.i, v0.f)
Prototype glUniform2f(location.i, v0.f, v1.f)
Prototype glGetShaderInfoLog(shader.i, bufSize.l, *length_l, *infoLog)
Prototype.i glGetProcAddress(name.s)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Global glGetProcAddress.glGetProcAddress = @glXGetProcAddress()
CompilerCase #PB_OS_Windows
Global glGetProcAddress.glGetProcAddress = @wglGetProcAddress()
CompilerDefault
CompilerError "Unsupported OS"
CompilerEndSelect
Global glCreateShader.glCreateShader = glGetProcAddress("glCreateShader")
Global glCreateProgram.glCreateProgram = glGetProcAddress("glCreateProgram")
Global glCompileShader.glCompileShader = glGetProcAddress("glCompileShader")
Global glLinkProgram.glLinkProgram = glGetProcAddress("glLinkProgram")
Global glUseProgram.glUseProgram = glGetProcAddress("glUseProgram")
Global glAttachShader.glAttachShader = glGetProcAddress("glAttachShader")
Global glShaderSource.glShaderSource = glGetProcAddress("glShaderSource")
Global glGetUniformLocation.glGetUniformLocation = glGetProcAddress("glGetUniformLocation")
Global glUniform1i.glUniform1i = glGetProcAddress("glUniform1i")
Global glUniform2i.glUniform2i = glGetProcAddress("glUniform2i")
Global glUniform1f.glUniform1f = glGetProcAddress("glUniform1f")
Global glUniform2f.glUniform2f = glGetProcAddress("glUniform2f")
Global glGetShaderInfoLog.glGetShaderInfoLog = glGetProcAddress("glGetShaderInfoLog")
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)
;debug "Vert: "+VertShader
glGetShaderInfoLog(VertShader,1023,@Textlength,@Mytext)
;debug MyText
;/ Compile Fragment Shader
FragShader.i = glCreateShader(#GL_FRAGMENT_SHADER)
*TxtPointer = Ascii(Fragment)
glShaderSource(FragShader, 1, @*TxtPointer, #Null)
glCompileShader(FragShader)
;debug "Frag: "+FragShader
glGetShaderInfoLog(FragShader,1023,@Textlength,@Mytext)
;debug MyText
;/ Create Shader Program
Program = glCreateProgram()
glAttachShader(Program,VertShader)
;debug "Attached Vert Shader"
glAttachShader(Program,FragShader)
;debug "Attached Frag Shader"
glLinkProgram(Program)
;debug "Link program"
If Use = 1
glUseProgram(Program)
EndIf
ProcedureReturn Program
EndProcedure
;}
Procedure Shader_Set(Fragment.i, shader$="")
If System\Shader_Program <> 0 ;/ delete the previous shaders
glUseProgram(0);
EndIf
If Fragment = -2 ; run the shader
System\Shader_Fragment_Text = GetGadgetText(#Gad_Editor)
ElseIf Fragment = -1 ; load the shader
System\Shader_Fragment_Text = shader$+Chr(10)
Else
Select Fragment
Case 0
System\Shader_Fragment_Text = "uniform float time;"+Chr(10)
System\Shader_Fragment_Text + "uniform vec2 resolution;"+Chr(10)
System\Shader_Fragment_Text + ""+Chr(10)
System\Shader_Fragment_Text + "void main( void ) {"+Chr(10)
System\Shader_Fragment_Text + " vec2 p = ( gl_FragCoord.xy / resolution.xy ) - 0.2;"+Chr(10)
System\Shader_Fragment_Text + " float sx = 0.3 * (p.x + 0.8) * sin( 3.0 * p.x - 1. * time);"+Chr(10)
System\Shader_Fragment_Text + " float dy = 4./ ( 123. * abs(p.y - sx));"+Chr(10)
System\Shader_Fragment_Text + " dy += 1./ (160. * length(p - vec2(p.x, 0.)));"+Chr(10)
System\Shader_Fragment_Text + " gl_FragColor = vec4( (p.x + 0.1) * dy, 0.3 * dy, dy, 2.1 );"+Chr(10)
System\Shader_Fragment_Text + "}"+Chr(10)
EndSelect
EndIf
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
;debug "Shader: "+System\Shader_Program
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")
;debug "Time location: "+System\Shader_Uniform_Time
;debug "Mouse location: "+System\Shader_Uniform_Mouse
;debug "Res location: "+System\Shader_Uniform_Resolution
;debug "SurfacePos location: "+System\Shader_Uniform_SurfacePosition
SetGadgetText(#Gad_Editor,System\Shader_Fragment_Text)
EndProcedure
Procedure OpenShader()
Define filename$ ="", txt$ = ""
filename$ = OpenFileRequester("Open shader","","All|*.*",0)
If filename$ <> ""
If ReadFile(0, filename$)
While Eof(0) = 0
txt$ + ReadString(0) +Chr(10)
Wend
CloseFile(0)
Shader_Set(-1,txt$)
Else
MessageRequester("Information","Impossible d'ouvrir le fichier!")
EndIf
EndIf
EndProcedure
Procedure SaveShader()
Define filename$ =""
filename$ = SaveFileRequester("Save","","txt|*.txt",0)
If filename$ <> ""
If OpenFile(0, filename$)
WriteStringN(0, GetGadgetText(#Gad_Editor))
CloseFile(0)
EndIf
EndIf
EndProcedure
Procedure RunShader()
Shader_Set(-2)
EndProcedure
Shader_Set(0)
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)
;FlipBuffers()
EndProcedure
;CreateRenderTexture(1, CameraID(0), CameraViewWidth(0), CameraViewHeight(0), #PB_Texture_AutomaticUpdate)
;CreateMaterial(9, TextureID(9))
Repeat
Repeat
System\Event = WindowEvent()
Select System\Event
Case #PB_Event_Menu
Select EventMenu()
Case #Menu_Open
OpenShader()
Case #Menu_Save
SaveShader()
Case #Menu_Run
RunShader()
EndSelect
Case #PB_Event_CloseWindow
System\Exit = #True
Case #PB_Event_Gadget
Select EventGadget()
Case #Gad_ShaderSelector_Combo
Select EventType()
Case #PB_EventType_Change
;debug "Set to: "+GetGadgetState(#Gad_ShaderSelector_Combo)
Shader_Set(GetGadgetState(#Gad_ShaderSelector_Combo))
EndSelect
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()
RenderWorld()
Render()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Space)
t+1
If flag=0
FreeCamera(1)
flag=1
EndIf
If t=1
SaveRenderTexture(1, "empty.png")
Else
No + 1
SaveRenderTexture(1, "test" + Str(No) + ".png")
EndIf
EndIf
If KeyboardReleased(#PB_Key_Z)
If IsCamera(1) = 0
flag=0 : t=0
CreateCamera(1, 0, 0, 100, 100)
EndIf
EndIf
Until System\Exit
Ich glaube es liegt irgentwie an glew (glew_init fehlt, oder ?)
Wie bekomme ich das unter Linux zum laufen ?
Also das hier liefert bei mir:
ImportC "-lGLEW"
glewInit()
EndImport
und der Aufruf:
Debug glewInit()
liefert bei mir 0