@em_uk , i have made an experiments using the shader in the link you have provided
http://glslsandbox.com/e#24834.0 and it works with pjay program, some shaders hang my firefox , may be my system does not support it, but what works can be displayed in pjay program. here is i have tried this shader
http://glslsandbox.com/e#24923.3 and saved it to file:
case02.frag (i have used notepad with save as all files and encoding ansi, it does not work when i saved it with PB ide as save type all files):
Code: Select all
//---------------------------------------------------------
// Shader: IllustratedEquations.glsl 4/2015
// http://glslsandbox.com/e#24891
// Original: https://www.shadertoy.com/view/MtBGDW
// Created by sofiane benchaa - sben/2015
// tags: procedural, 2d, fractal, trigonometric, curve, complex, iterative
// info: http://www.mathcurve.com/surfaces/tore/tn.shtml
// http://xrt.wikidot.com/gallery:implicit
//---------------------------------------------------------
#ifdef GL_ES
precision mediump float;
#endif
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
//---------------------------------------------------------
#define FIELD 28.0
#define ITERATION 12
#define CHANNEL bvec3(true,true,true)
#define PI4 0.7853981633974483
#define TONE vec3(0.299,0.587,0.114)
//just a line
float crossEQ(vec3 p,float t)
{
float pv = p.x * p.y;
return pv * pv;
}
// triangle
float triangleEQ( vec3 p, float t )
{
return max(abs(p.x)*PI4+p.y*0.5,-p.y) - 0.1+ 0.2*sin(t);
}
//---------------------------------------------------------
// regular trifolium
// http://www.mathcurve.com/surfaces/tore/tn.shtml
// ((x^2+y^2)^2-x*(x^2-3*y^2))^2+z^2-0.008=0
float bretzTrifolEQ (vec3 p, float t)
{
float x2 = p.x*p.x;
float y2 = p.y*p.y;
float fv = (x2+y2)*(x2+y2)-p.x*(x2-3.0*y2);
fv *= fv;
fv += p.z * p.z;
fv /= 0.008+0.006*sin(t);
return fv;
}
// Bretzel6
// ((x^2+y^2/4-1)*(x*x/4+y*y-1))^2-z^2=0.1
float bretzel6EQ(vec3 p,float t)
{
float x2 = p.x*p.x;
float y2 = p.y*p.y;
float fv = (x2+y2/4.-1.)*(x2/4.+y2-1.);
fv *= fv;
fv += p.z*p.z;
fv /= 0.06+0.04*sin(t);
return fv;
}
// quad torus
// (x^2*(1-x^2)^2*(4-x^2)^3-20*y^2)^2+80*z^2=22
float quadTorusEQ(vec3 p,float t)
{
float x2 = p.x*p.x;
float y2 = p.y*p.y;
float fv = x2*pow(1.0-x2,2.)*pow(4.0-x2,3.0)-20.0*y2;
fv *= fv;
fv += 1.0*(p.z*p.z);
fv /= 22.0 + 16.*sin(t);
return fv;
}
//lemniscat Bernoulli
// ((x^2+y^2)^2-x^2+y^2)^2+z^2=0.01
float bretzBernEQ(vec3 p,float t)
{
float x2 = p.x*p.x;
float y2 = p.y*p.y;
float fv = ((x2+y2)*(x2+y2)-x2+y2);
fv *= fv;
fv /= 0.02 + 0.01*sin(t);
return fv;
}
// animated calamari
float pieuvreEQ(vec3 p,float t)
{
float fv = p.x;
fv = (p.y+length(p*fv)-cos(t+p.y));
fv = (p.y+length(p*fv)-cos(t+p.y));
fv = (p.y+length(p*fv)-0.5*cos(t+p.y));
fv *= fv*0.1;
return fv;
}
//---------------------------------------------------------
//iterative equations
//mandelbrot
float mandelbrotEQ(vec3 c,float t)
{
vec4 z = vec4(c,0.0);
vec3 zi = vec3(0.0);
for(int i=0; i<ITERATION; ++i)
{
zi.x = (z.x*z.x-z.y*z.y);
zi.y = 2.*(z.x*z.y);
zi.xyz += c;
if(dot(z.xy,z.xy)>4.0)break;
z.w++;
z.xyz=zi;
}
z.w /= float(ITERATION);
return 1.0-z.w;
}
//---------------------------------------------------------
// wolf face
float wolfFaceEQ(vec3 p,float t)
{
vec2 fx = p.xy;
p=(abs(p*2.0+sin(t)*0.7));
const float j=float(ITERATION);
vec2 ab = vec2(2.0-p.x);
for(float i=0.0; i<j; i++)
{
ab+=(p.xy)-cos(length(p));
p.y+=sin(ab.x-p.z)*0.5;
p.x+=sin(ab.y)*0.5;
p-=(p.x+p.y);
p+=(fx.y+cos(fx.x));
ab += vec2(p.y);
}
p /= FIELD;
return p.x + p.x + p.y;
}
// dog face
float dogFaceEQ(vec3 p,float t)
{
vec2 fx = p.xy;
p=(abs(p*2.0)+sin(t)*0.2);
const float j=float(ITERATION);
vec2 ab = vec2(2.0-p.x);
for(float i=0.0; i<j; i++)
{
ab+=p.xy+cos(length(p));
p.y+=sin(ab.x-p.z)*0.5;
p.x+=sin(ab.y)*0.5;
p-=(p.x+p.y);
p-=((fx.y)-cos(fx.x));
}
p /= FIELD;
return p.x + p.x + p.y;
}
//---------------------------------------------------------
vec3 computeColor(float fv)
{
vec3 color = vec3(vec3(CHANNEL)*TONE);
color -= (fv);
color.r += color.g*2.0;
color.g += color.b;
return clamp(color,(0.0),(1.0));
}
//---------------------------------------------------------
void main()
{
float ratio = resolution.y / resolution.x;
vec2 position = ( gl_FragCoord.xy / resolution.xy )-vec2(0.5, 0.9*ratio);
position.y *= ratio;
vec3 p = position.xyx*FIELD;
p.z = 2.0*FIELD*0.5;
vec3 color = computeColor(wolfFaceEQ(p+vec3(7.0, -1.0, 0.2),time));
p.z = 0.0;
color += computeColor(dogFaceEQ(p*2.0+vec3(0.0,-3.0, 0.0),time));
color += computeColor(mandelbrotEQ(p+vec3(-5.0,-4.0, 0.0),time));
color += computeColor(triangleEQ(p+vec3(-4.0,-1.0, 0.0),time));
color += computeColor(crossEQ(p+vec3(+2.3, 6.0, 0.0),time));
color += computeColor(quadTorusEQ(p+vec3(-5.0, 1.0, 0.0),time));
color += computeColor(bretzTrifolEQ(p+vec3(-6.0, 3.0, 0.0),time));
color += computeColor(bretzel6EQ(p+vec3(-7.4, -2.0, 0.0),time));
color += computeColor(bretzBernEQ(p+vec3(-4.0, 3.0, 0.0),time));
color += computeColor(pieuvreEQ(p*2.5+vec3(-4.0, 4.0, 0.0),time));
gl_FragColor = vec4( color, 1.0 );
}
and then use that file in pjay program :
Code: Select all
;/ GLSL example to test new OpenGLGadget - PJ 06/2014.
;EnableExplicit
Enumeration ;/ Window
#Window_Main
EndEnumeration
Enumeration ;/ Gadget
#Gad_OpenGL
#Gad_Editor
#Gad_ShaderSelector_Combo
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_ScreenCentered|#PB_Window_SystemMenu)
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)
For MyLoop = 1 To 42
AddGadgetItem(#Gad_ShaderSelector_Combo,-1,"Shader: "+Str(MyLoop))
Next
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)
Global glCreateShader.glCreateShader = wglGetProcAddress_("glCreateShader")
Global glCreateProgram.glCreateProgram = wglGetProcAddress_("glCreateProgram")
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 glUniform2f.glUniform2f = wglGetProcAddress_("glUniform2f")
Global glGetShaderInfoLog.glGetShaderInfoLog = wglGetProcAddress_("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 = @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 = @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)
If System\Shader_Program <> 0 ;/ delete the previous shaders
glUseProgram(0);
EndIf
Select Fragment
Case 0
ReadFile(1,"case02.frag", #PB_Ascii )
For i=1 To 195
System\Shader_Fragment_Text + ReadString(1) +#CRLF$
Next
CloseFile(1)
EndSelect
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
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)
EndProcedure
Repeat
Repeat
System\Event = WindowEvent()
Select System\Event
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()
Render()
Until System\Exit
it will show animated shapes:
