Although shaders do not remember what has been done to an image, in an indirect way I have been able to use a shader to obtain the changes to an image done by a shader to the sprite's image by using AGK's GetImage command. While advised not to use this command each frame, it has a better performance than the other options in this thread. I have included a sample code as well as the burn vs and ps shader created by janbo. Just mouse over the image to scratch off the gray sprite's image and reveal the blue sprite underneath.
+ Code Snippet// Project: revealwshader
// Created: 2022-04-14
// set window properties
SetWindowTitle( "revealwshader" )
SetWindowSize( 1280, 800, 0 )
// set display properties
SetVirtualResolution(1280,800)
SetOrientationAllowed( 1, 1, 1, 1 )
SetPrintColor(250,250,250)
SetPrintSize(30)
SetClearColor(16,32,64)
//SetRawMouseVisible(0)
#constant windowwidth 1280
#constant windowheight 800
SetSyncRate(0,0)
Global TSprite as Integer
Global CircleImageID as Integer
Global x# as Float
Global y# as Float
Global rechide as Integer //sprite number for hidden rectangle
Global rechImageID as Integer //image number for hidden sprite
DrawEllipse(12, 12, 12, 12, MakeColor(200, 200, 200), MakeColor(200, 200, 200), 1)
CircleImageID=GetImage(0,0,48,48)
TSpriteID=CreateSprite(CircleImageID) //pointer sprite
SetSpritePosition(TSpriteID, 700, 700)
SetSpriteSize(TSpriteID, 13.6,1)
SetSpriteDepth(TSpriteID, 4)
SetSpriteOffSet(TSpriteID, 12, 12)
SetSpriteVisible(TSpriteID, 0)
ClearScreen()
DrawBox(0, 0, 410, 256, MakeColor(10,10,255), MakeColor(10,10,255), MakeColor(10,10,255), MakeColor(10,10,255), 1) //blue image for covered sprite
rechImageID=GetImage(0, 0, 410, 256)
rechide = CreateSprite(rechImageID) //create covered blue sprite
SetSpritePosition(rechide, 50, 50)
SetSpriteDepth(rechide, 9)
ClearScreen()
DrawBox(0, 0, 410, 256, MakeColor(100,100,100), MakeColor(100,100,100), MakeColor(100,100,100), MakeColor(100,100,100), 1) //gray image for covering blue sprite
ImageID=GetImage(0, 0, 410, 256)
ClearScreen()
// overlay image
DiscardImageID=loadimage("noise.png")
SpriteID=createsprite(ImageID)
SetSpriteAdditionalImage(SpriteID,DiscardImageID,1)
SetSpriteTransparency(SpriteID,1)
setspritesize(SpriteID,410, 256)
SetSpritePosition(SpriteID,50,50)
SetSpriteDepth(SpriteID, 8)
ShaderID=LoadShader("reveal.vs", "reveal.ps" )
SetSpriteShader(SpriteID,ShaderID)
setShaderConstantByName(ShaderID, "center",0.0,0.0,0.1,0)
setShaderConstantByName(ShaderID, "BurnParams",200.0, 0.0, 0.0,0 ) //pass the burn parameters to the shader--the larger the first value the smaller the line width drawn
setShaderConstantByName(ShaderID, "time",0.005, 0, 0, 0) //pass the time parameter to the shader
do
PointerX#=GetPointerX()
PointerY#=GetPointerY()
SetSpritePositionByOffset(TSpriteID,PointerX#,PointerY#)
if GetSpriteHitTest(SpriteID,PointerX#,PointerY#)=1
UpDate2D(GetFrameTime())
x# = (PointerX# - GetSpriteX(rechide)) / GetSpriteWidth(rechide) //convert Xpointer to image coordiantes and then divide by width to set value from 0 to 1
y# = (PointerY# - GetSpriteY(rechide)) / GetSpriteHeight(rechide) ////convert Ypointer to image coordiantes and then divide by height to set value from 0 to 1
setShaderConstantByName(ShaderID, "center",x#,y#,0,0)
Render()
DeleteImage(ImageID)
ImageID = GetImage(50, 50, 410, 256) // grab image on screen after shader removes part of it
Swap()
SetSpriteImage(SpriteID, ImageID) //Change the sprite's image to new image that has part scratched off
endif
Print( ScreenFPS() )
Sync()
loop
I have also attached the original noise.png file used in janbo's example for the burn shader.