Hi folks,
after a long time i'm back and have a question.
i wrote a demo code that show up a glsl shader and playing a v2m sound file.
how does it looks like (plain and simple)
after some fails i wanna explain the problem that i have.
If i'm sending the V2M Music Main Out to the Shader, that one of the white SinWave react to the Music nice and smoove does not work properly.
I tried a lot but always unnatural values will be sent to a SinWave and it wobble like this:
this is not what i want
define the value as following in Line 96:
Change = MP_GetChannelVUV2M(channel, @left.f, @right.f)
and adding the "change" into the shader code in Line 128 as an example:
Fragment$ + " float angle = iTime * speed * frequency *" + Change +"+(shift + uv.x) * 2.0; " + Chr(10)
i know there is anything missing in my thoughts.
maybe some one can help?
if you try to run the code properly, you need a PureBasic Version that support MP3D Lib because i used the v2m Lib that is included. Not to forget in Compiler Settings the LibSubsystem set to : dx9
;:
;: PureBasic Version 5.43 LTS x86
;:
;:
;: get the MP3D Lib from here:
;: inc-games-design.de/Tools/Mp3dLib_installer.rar
;:
;:
Enumeration
#Main
EndEnumeration
Enumeration
#leftbar
#rightbar
#Gad_OpenGL
#Exit_btn
#Gadget_exit
#textgadget
#Infobar_Font
EndEnumeration
#GL_VERTEX_SHADER = $8B31
#GL_FRAGMENT_SHADER = $8B30
#GL_BGR = $80E0
#GL_BGRA = $80E1
DataSection
Song:
IncludeBinary "Sound\mpl.v2m"
SongEnd:
EndDataSection
;:handle the GLSL needs
XIncludeFile "include\cm_opengl_uni.pbi" : UseModule cm_opengl
Define IsPlaying, EndOfTrackReached, EventGadget
Define.i Event
;:V2M Music File Main Out - left / right
Define MainVULeft.f,MainVURight.f
;:Channels V2M Music File - no need yet
Define Ch0VULeft.f, Ch0VURight.f
Define Ch1VULeft.f, Ch1VURight.f
Define Ch2VULeft.f, Ch2VURight.f
Define Ch3VULeft.f, Ch3VURight.f
Define Ch4VULeft.f, Ch4VURight.f
Define Ch5VULeft.f, Ch5VURight.f
Define Ch6VULeft.f, Ch6VURight.f
Define Ch7VULeft.f, Ch7VURight.f
Define Ch8VULeft.f, Ch8VURight.f
Define Ch9VULeft.f, Ch9VURight.f
Define Ch10VULeft.f, Ch10VURight.f
Define Ch11VULeft.f, Ch11VURight.f
Define Ch12VULeft.f, Ch12VURight.f
Define Ch13VULeft.f, Ch13VURight.f
Define Ch14VULeft.f, Ch14VURight.f
Define Ch15VULeft.f, Ch15VURight.f
Procedure Open_MainScreen()
CreateImage(#Exit_btn,16,16)
StartDrawing(ImageOutput(#Exit_btn))
FillArea(1,1,-1,RGB(137,187,229))
Line(0,16,16,-17,RGB(45, 45, 45))
Line(0,0,16,16,RGB(45, 45, 45))
StopDrawing()
OpenWindow(#Main, 0 , 0, 640, 480,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_Invisible)
SetWindowColor(#Main, RGB(137,187,229))
SetClassLongPtr_(WindowID(#Main), #GCL_STYLE, #CS_DROPSHADOW)
;:exit button
ImageGadget(#Gadget_exit,WindowWidth(0)-22,2,16,16,ImageID(#Exit_btn))
TextGadget(#textgadget,5, 1, 567, 20, "GLSL Shader Test: inc 2019",#SS_CENTERIMAGE)
SetGadgetFont(#textgadget, LoadFont(#Infobar_Font, "Microsoft Sans Serif", 8, #PB_Font_HighQuality))
SetGadgetColor(#textgadget , #PB_Gadget_BackColor, RGB(137,187,229))
SetGadgetColor(#textgadget , #PB_Gadget_FrontColor, RGB(15, 15, 15))
OpenGLGadget(#Gad_OpenGL, 0, 20, 640, 460, #PB_OpenGL_Keyboard)
Init_OpenGL(#Gad_OpenGL, 640, 420)
HideWindow(#Main, #False)
EndProcedure
Open_MainScreen()
MP_CatchV2M(?Song) ;LOAD SONG
MP_PlayV2M(0) ;0 START SOUND FROM THE BEGINNING
MP_SetVolumeV2M(1)
MP_GetMainVUV2M(@MainVULeft.f,@MainVURight.f)
;channel = -1
;Change = MP_GetChannelVUV2M(channel, @left.f, @right.f)
;Change = MP_GetChannelVUV2M(channel, @MainVULeft.f, @MainVURight.f)
;SetGadgetState(#ProgressBar_6,(Ch1VULeft + Ch1VURight)*20)
;:----------------------------------------------------------------------------------------
;:The plain Shader Code
;{
Vertex$ = "attribute vec3 position;"
Vertex$ + "attribute vec2 surfacePosAttrib;"
Vertex$ + "varying vec2 surfacePosition;"
Vertex$ + " void main() {"
Vertex$ + " surfacePosition = surfacePosAttrib;"
Vertex$ + " gl_Position = vec4( position, 1.0 );"
Vertex$ + " }"
Fragment$ = " #ifdef GL_ES " + Chr(10)
Fragment$ + " precision mediump float; " + Chr(10)
Fragment$ + " #endif " + Chr(10)
Fragment$ + " #extension GL_OES_standard_derivatives : enable " + Chr(10)
Fragment$ + " uniform float time; " + Chr(10)
Fragment$ + " uniform vec2 mouse; " + Chr(10)
Fragment$ + " uniform vec2 resolution; " + Chr(10)
Fragment$ + " const vec3 top = vec3(0.318, 0.831, 1.0); " + Chr(10)
Fragment$ + " const vec3 bottom = vec3(0.094, 0.141, 0.424); " + Chr(10)
Fragment$ + " const float widthFactor = 1.5; " + Chr(10)
Fragment$ + " #define iTime time " + Chr(10)
Fragment$ + " #define iResolution resolution " + Chr(10)
Fragment$ + " vec3 calcSine(vec2 uv, float speed, " + Chr(10)
Fragment$ + " float frequency, float amplitude, float shift, float offset, " + Chr(10)
Fragment$ + " vec3 color, float width, float exponent, bool dir) " + Chr(10)
Fragment$ + " { " + Chr(10)
Fragment$ + " float angle = iTime * speed * frequency *" + Change +"+(shift + uv.x) * 2.0; " + Chr(10)
Fragment$ + " float y = sin(angle) * amplitude + offset; " + Chr(10)
Fragment$ + " float clampY = clamp(0.0, y, y); " + Chr(10)
Fragment$ + " float diffY = y - uv.y; " + Chr(10)
Fragment$ + " float dsqr = distance(y, uv.y); " + Chr(10)
Fragment$ + " float scale = 1.0; " + Chr(10)
Fragment$ + " if(dir && diffY > 0.0) " + Chr(10)
Fragment$ + " { " + Chr(10)
Fragment$ + " dsqr = dsqr * 4.0; " + Chr(10)
Fragment$ + " } " + Chr(10)
Fragment$ + " else if(!dir && diffY < 0.0) " + Chr(10)
Fragment$ + " { " + Chr(10)
Fragment$ + " dsqr = dsqr * 4.0; " + Chr(10)
Fragment$ + " } " + Chr(10)
Fragment$ + " scale = pow(smoothstep(width * widthFactor, 0.0, dsqr), exponent); " + Chr(10)
Fragment$ + " return min(color * scale, color); " + Chr(10)
Fragment$ + " } " + Chr(10)
Fragment$ + " void mainImage( out vec4 fragColor, in vec2 fragCoord ) " + Chr(10)
Fragment$ + " { " + Chr(10)
Fragment$ + " vec2 uv = fragCoord.xy / iResolution.xy; " + Chr(10)
Fragment$ + " vec3 color = vec3(mix(bottom, top, uv.y)); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.2, 0.20, 0.2, 0.0, 0.5, vec3(0.3, 0.3, 0.3), 0.1, 15.0,false); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.4, 0.40, 0.15, 0.0, 0.5, vec3(0.3, 0.3, 0.3), 0.1, 17.0,false); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.3, 0.60, 0.15, 0.0, 0.5, vec3(0.3, 0.3, 0.3), 0.05, 23.0,false); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.1, 0.26, 0.07, 0.0, 0.3, vec3(0.3, 0.3, 0.3), 0.1, 17.0,true); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.3, 0.36, 0.07, 0.0, 0.3, vec3(0.3, 0.3, 0.3), 0.1, 17.0,true); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.5, 0.46, 0.07, 0.0, 0.3, vec3(0.3, 0.3, 0.3), 0.05, 23.0,true); " + Chr(10)
Fragment$ + " color += calcSine(uv, 0.2, 0.58, 0.05, 0.0, 0.3, vec3(0.3, 0.3, 0.3), 0.2, 15.0,true); " + Chr(10)
Fragment$ + " fragColor = vec4(color,1.0); " + Chr(10)
Fragment$ + " } " + Chr(10)
Fragment$ + " void main( void ) { " + Chr(10)
Fragment$ + " mainImage(gl_FragColor, gl_FragCoord.xy); " + Chr(10)
Fragment$ + " } " + Chr(10)
;}
CreateShader(1, Vertex$, Fragment$)
UseShader(1)
Repeat
Event = WindowEvent()
EventGadget = EventGadget()
Render_OpenGL()
;: LOOP FUNCTION V2M SOUND
If MP_IsPlayingV2M()
IsPlaying=1 ;CHECK IF SONG IS PLAYING
Else
EndOfTrackReached=1 ;IF SONG REACHED ITS END
MP_PlayV2M(0) ;0 STARTs SONG At THE BEGINNING
EndIf
Select Event
Case #WM_LBUTTONDOWN
If WindowMouseX(#Main) >= 0 And WindowMouseX(#Main) <= 640 And WindowMouseY(#Main) >= 0 And WindowMouseY(#Main) <= 61
SendMessage_(WindowID(#Main), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_exit
End
EndSelect
EndSelect
;ESC END PROGRAM
If GetAsyncKeyState_(#VK_ESCAPE)
End
EndIf
Until Event = #PB_Event_CloseWindow
End
the complete package is attached to this posting.