Shader coding with PB possible?

Everything related to 3D programming
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Shader coding with PB possible?

Post by em_uk »

Hi Guys,

I've recently got into shader coding and love it (although I am not very good yet), I love the simplicity in which you can create gorgeous effects.

Is there anyway to do this with PB? Not convert the code but use shader scripts to display stuff?

For example : http://glslsandbox.com/e#24834.0

And here is a great tool in use at Revision 2015 for live shader coding :

https://youtu.be/j4baExLqNoI?t=4564
----

R Tape loading error, 0:1
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Shader coding with PB possible?

Post by Samuel »

Hello em_uk,

I guess the first question is are you using Purebasic's Ogre implementation, the openglgadget, or something else?

If your using Ogre then you will use material scripts linked to the shader that will send all your parameters to the shader like world matrices, light sources, and so on. I've posted a couple of Ogre's sample shaders and a few of my own on the forums in the past.

Here's a few links for some examples to look at.
http://www.purebasic.fr/english/viewtop ... 36&t=58739
http://www.purebasic.fr/english/viewtop ... 36&t=56159
http://www.purebasic.fr/english/viewtop ... 36&t=57878
http://www.ogre3d.org/tikiwiki/shaders

Also Purebasic's Ogre is limited to DirectX 9 and OpenGL 2.1 (Not positive on the OpenGL version). Which limits the shader language you can use. With DirectX 9 you can only use HLSL shader model 3 or lower and with OpenGL 2.1 you can use only up to GLSL 1.2.
You can also use CG shaders, but in my experience they seem to be a little slower than GLSL and HLSL shaders which may be why it was abandoned a while back.

If your using something else besides Ogre then it depends on what else is.
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Re: Shader coding with PB possible?

Post by em_uk »

Thanks for the response Samuel.

I'm not using anything specifically yet, but I want to be able to create effects like what you see on http://glslsandbox.com/

I'm not really up for having to create something completely from scratch but want to use GLSL or HLSL language to make my effects (mostly for demo programming).

I've had a quick look at the links you've provided, thanks for that but I don't see anything along the lines of what I am looking for.

Using something like this :

Code: Select all

#ifdef GL_ES
precision highp float;
#endif
#extension GL_OES_standard_derivatives : enable

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

float iGlobalTime=time;
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float amp = 8.0;
    float freq = 2.0; //* abs(sin(iGlobalTime));
    float slide = 1.0 - iGlobalTime * 0.2;
    float xx = 1.0 - abs((fragCoord.y / resolution.x - .3) * amp - sin((fragCoord.x / resolution.x - slide) * freq));
    float xz = 1.0 - abs((fragCoord.y / resolution.x - .3) * amp - sin((fragCoord.x / resolution.x - 1.0 - slide * -.5) * freq));
    float xr = 1.0 - abs((fragCoord.y / resolution.x - .3) * amp - sin((fragCoord.x / resolution.x - 2.4 - slide * 1.9) * freq));
	fragColor.b = xz;
    fragColor.r = xx;
    fragColor.g = xr;
}
void main( void ){vec4 color = vec4(0.0,0.0,0.0,1.0);mainImage( color, gl_FragCoord.xy );color.w = 1.0;gl_FragColor = color;}
to do this : http://glslsandbox.com/e#24908.0 is where I would like to get to.

Cheers!
----

R Tape loading error, 0:1
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Shader coding with PB possible?

Post by Samuel »

em_uk wrote: I'm not using anything specifically yet, but I want to be able to create effects like what you see on http://glslsandbox.com/
The reason I asked is because it's different depending on which one you choose.

Going by your response it seems like you don't want to use Ogre which is fine.
This leaves plain OpenGL or DirectX which both require a lot of hair pulling to use in any language.

Since shaders and graphics aren't exactly a hot topic around the Purebasic forums.
I'd recommend looking up OpenGL and/or DirectX C++ tutorials which would give you something to work of off.
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Re: Shader coding with PB possible?

Post by em_uk »

Ok, so while I have been unwell I have been looking a C++. I've found lots of examples and actually C++ isn't as difficult as I thought. I found some OpenGL examples for PB and like you said, it would needs lots of work to get up and running. Ideally I would have liked to built a frame work to digest hlsl/glsl scripts but it looks like a lot of work.

I think I will invest my time in C++ for shaders and demo coding. PB doesn't seem to have the support around the subject I need. OGRE isn't an option as it uses CG files which are depreciated these days anyway which again is a limiting factor.

One last quest, vertex and fragment shader scripts - why do I see examples of them being supplied as two files in places? How do I know which part of the script does what?

thanks for the advice.
----

R Tape loading error, 0:1
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Shader coding with PB possible?

Post by Samuel »

Well, there's actually even more parts to the shader pipeline, but you can use only what you need.
https://www.opengl.org/wiki/Rendering_Pipeline_Overview

The two most commonly used ones are vertex and fragment shaders.
Vertex shaders are mainly used for setting up vertices, normals, uvs, and other parameters not suited for the fragment shader.
Fragment shaders are related mainly to the graphic portion. They can receive information from the vertex shader to be used in calculating the outputted pixels onto your screen.

In the examples you showed above only fragments shaders are used because it is a fullscreen 2d effect.
If for example you were to render that effect onto a flat plain in 3D space it would then require a vertex shader that handles its location in 3D space.

Hope this helps a little and if you need more info on the subject let me know.
pjay
Enthusiast
Enthusiast
Posts: 163
Joined: Thu Mar 30, 2006 11:14 am

Re: Shader coding with PB possible?

Post by pjay »

When I was toying with the OpenGLGadget last year, I wrote a GLSL viewer that I think is similar to what you're after - no GLSL editing though (although it's displayed in an editorgadget), but it shouldn't be difficult to add if required.

Image

Download (Source and executable): https://dl.dropboxusercontent.com/u/600 ... 20GLSL.zip
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Re: Shader coding with PB possible?

Post by em_uk »

OH MY GOOD LORD!!!

That is EXACTLY what I was after! WOW!!!

Now do excuse me while I head over to my neighbours house to collect my socks, as they have been well and truly blown off!

My weekend has been made already and it's only Friday!

THANK YOU! :D :D :D :D

Edit : Samuel - thank you also for the description - that helps a lot. From having absolutely no idea about how shaders work and spending 3 days hammering the subject your explanations have helped immensely. Really appreciate your time :)
----

R Tape loading error, 0:1
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

Re: Shader coding with PB possible?

Post by applePi »

@pjay, i have said before a few hours that i dislike shaders, but your program produces infinity of unexpected beautiful graphics , i like the output of shader number 31
Thank you
Last edited by applePi on Sat May 02, 2015 6:42 am, edited 1 time in total.
User avatar
oreopa
Enthusiast
Enthusiast
Posts: 281
Joined: Sat Jun 24, 2006 3:29 am
Location: Edinburgh, Scotland.

Re: Shader coding with PB possible?

Post by oreopa »

Great thread and great program pjay. Informative stuff.
Proud supporter of PB! * Musician * C64/6502 Freak
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Re: Shader coding with PB possible?

Post by em_uk »

One last question (for now) @pjay - you included a Cube Physics example which uses what seems to be a personal include pjGL.pbi

It contains another (I'm such a beggar) include pjText which prints to OpenGL screen, is that include one you'd be willing to share? Or is it no use without the overall PureGL Project.

Or is that quite a simple procedure to work out?

Thanks again for the insight on the shader code. I'm still so very happy! (I can close Visual Studio for the foreseeable future ;)

:)
----

R Tape loading error, 0:1
User avatar
Comtois
Addict
Addict
Posts: 1429
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Re: Shader coding with PB possible?

Post by Comtois »

Thank you pjay, this is fantastic.
Please correct my english
http://purebasic.developpez.com/
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

Re: Shader coding with PB possible?

Post by applePi »

@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:
Image
User avatar
em_uk
Enthusiast
Enthusiast
Posts: 366
Joined: Sun Aug 08, 2010 3:32 pm
Location: Manchester UK

Re: Shader coding with PB possible?

Post by em_uk »

Hi applePi

Yes it's a great bit of code by pjay.

I was up until 4am, I've added a scintilla gadget, live editing, saving/loading, drag and drop support, music playback and an FFT float sent to the shader so it can react to music!

:)

Image
----

R Tape loading error, 0:1
User avatar
DK_PETER
Addict
Addict
Posts: 898
Joined: Sat Feb 19, 2011 10:06 am
Location: Denmark
Contact:

Re: Shader coding with PB possible?

Post by DK_PETER »

Here's a WindowedScreen() version with load/save and test current script.

Link's gone
Last edited by DK_PETER on Thu Jun 04, 2015 4:06 pm, edited 3 times in total.
Current configurations:
Ubuntu 20.04/64 bit - Window 10 64 bit
Intel 6800K, GeForce Gtx 1060, 32 gb ram.
Amd Ryzen 9 5950X, GeForce 3070, 128 gb ram.
Post Reply