Posted: 13th Apr 2022 15:30
Well if you dont want to use a specific transparency color for your image like you had in the past like pink seen in the old days cause it's not used in the resulting image, then nope this would be the way to go, but instead of using draw circle you would use a sprite as a brush
But if you want to be slightly more flexible you'd still use setrendertoimage but you'd render to a mask cause drawing a fully transparent sprite or circle will do nothing as rendering to something only knows about the RGB Chanels.
Performance wise the first method would probably be a tiny bit faster as you dont need to pass a second image to the shader that renders your final image to the screen.
Posted: 13th Apr 2022 17:07
Thanks very much to all who have helped. I was able to improve the performance of the no shader approach a bit by eliminating the sprite cloning and sprite creation and deletion, by just setting the sprite image to the new render image. I have also determined how to set the sprites to another position other than the render image position, code as follows (needed image is below the code):

+ Code Snippet
// Project: revealnoshaderv2 
// Created: 2022-04-13

#constant KEY_ESCAPE 27
#constant SCREEN_WIDTH 1024
#constant SCREEN_HEIGHT 768
#constant SCREEN_DEPTH 32

SetErrorMode(2)
// set window properties
SetWindowTitle( "revealnoshaderv2" )
SetWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT, 0)
SetWindowAllowResize(0)
SetOrientationAllowed(1, 0, 0, 0)
 
SetVirtualResolution(SCREEN_WIDTH, SCREEN_HEIGHT)
SetSyncRate(0, 0)
SetScissor(0,0,0,0)
UseNewDefaultFonts(1)

SetRawMouseVisible(0) //hide mouse cursor
 
Global TSprite as Integer
Global CircleImageID as Integer
Global x2# as Float
Global y2# 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)
SetSpriteDepth(TSpriteID, 4)
SetSpriteOffSet(TSpriteID, 12, 12)
ClearScreen()

DrawBox(0, 0, 512, 384, 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, 512, 384)
ClearScreen()

rechide = CreateSprite(rechImageID)  //create covered blue sprite
//SetSpritePosition(rechide, 0, 0)
SetSpritePosition(rechide, 250, 200)
SetSpriteDepth(rechide, 9)

 
// overlay image
imgRender = LoadImage("gray.png")

sprRender = CreateSprite(imgRender)
SetSpritePosition(sprRender, 250, 200)
SetSpriteTransparency(sprRender, 1)
SetSpriteDepth(sprRender, 8)

do
  ClearScreen()
 
  SetRenderToImage(imgRender, 0)
   
  if (GetPointerState() = 1)
	  x2# = GetPointerX()
	  y2# = GetPointerY()
	  
      SetSpritePositionByOffset(TSpriteID, x2#, y2#)
      
      //set ellipse to same color as transparency color and convert x2# and y2# coordinates for ellipse to render image coordinates of 0,0 to 1023,767 using hidden image's left and top positions--could use scratch off image position as well
      DrawEllipse((x2# - GetSpriteX(rechide)) * (SCREEN_WIDTH/GetSpriteWidth(rechide)) , (y2# - GetSpriteY(rechide)) * (SCREEN_HEIGHT/GetSpriteHeight(rechide)), 24, 24, MakeColor(255, 100, 100), MakeColor(255, 100, 100), 1)
  endif
   
  SetRenderToScreen()
  
  SetImageTransparentColor(imgRender, 255, 100, 100)

  SetSpritePositionByOffset(TSpriteID, x2#, y2#) 
  
  SetSpriteImage(sprRender, imgRender)  //Change the sprite's image to new image that has part scratched off

  if (GetRawKeyState(KEY_ESCAPE) = 1)
    end
  endif
  
   Print( ScreenFPS() )

 Sync()
loop
Posted: 14th Apr 2022 18:52
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


vs code:
+ Code Snippet
attribute vec4 position;
attribute vec4 color;
attribute vec2 uv;

varying vec2 uvVarying;
varying vec4 colorVarying;
varying vec2 posVarying;

uniform mat4 agk_Ortho;


void main()
{ 
	gl_Position = agk_Ortho * position;
	posVarying = position.xy;
	uvVarying = uv;
	colorVarying = color;
}


ps code:
+ Code Snippet
uniform sampler2D texture0;
uniform sampler2D texture1;

varying vec2 uvVarying;
varying vec2 posVarying;

uniform vec2 agk_resolution;

uniform vec2 center; // Mouse position
uniform float time; //effect elapsed time // uniform vec2 time;
uniform vec3 BurnParams; // 10.0, 0.8, 0.1
void main()
{
	vec4 ColorTexture = texture2D(texture0, uvVarying);
	vec4 DiscardTexture = texture2D(texture1, uvVarying);
	
	float dist = distance(uvVarying, center);
	float diff = ((dist - time) * BurnParams.x ); //dist * BurnParams.x; //
	float Alpha = 1.0 - ((DiscardTexture.r) / diff)/diff;
	if(DiscardTexture.r > diff) discard;
	else
	{
		float Alpha = 1.0 - ((DiscardTexture.r) / diff)/diff;
	}
	gl_FragColor = vec4(ColorTexture.rgb,Alpha);
}


I have also attached the original noise.png file used in janbo's example for the burn shader.
Posted: 14th Apr 2022 19:44
insert DeleteImage (IMAGEID) before ImageID = GetImage(50, 50, 410, 256)
Posted: 14th Apr 2022 21:40
Thanks. Change made to code.