8Bit Colors lazarus / 39-Graphics ---------------------------------------------------------------------- Gigatron · 2025-04-09 23:16 Hi, Another nice shader fx from Coldberg Shadertoy called nes-ify; The goal is replacing image colors by the 8 bit computers or consoles like cpc464 ,zx-spectrum, CGA gameboy, c64 .... Try to start with CPC464, EGA, and GAME BOY; The used picture is a game Hybris from Amiga ; You can load your image , please resize it to power of 2 size; eg 128x128 ; 256x256; 512*512. Good Luck Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i unit Unit1; {$mode objfpc}{$H+} interface uses  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,  Spin, BGRAOpenGL, BGRABitmapTypes, BGRAOpenGL3D, BGLVirtualScreen; type  { TForm1 }   TForm1 = class(TForm)    ega_btn: TButton;    gboy_btn: TButton;    cpc_btn: TButton;    shader_on: TButton;    ShaderScreen1: TBGLVirtualScreen;    FragMemo: TMemo;    SpinEdit1: TSpinEdit;    Timer1: TTimer;    VertexMemo: TMemo;     procedure cpc_btnClick(Sender: TObject);    procedure ega_btnClick(Sender: TObject);    procedure gboy_btnClick(Sender: TObject);    procedure ShaderScreen1LoadTextures(Sender: TObject; BGLContext: TBGLContext);  procedure ShaderScreen1Redraw(Sender: TObject; BGLContext: TBGLContext);    procedure ShaderScreen1UnloadTextures(Sender: TObject; BGLContext: TBGLContext);    procedure FormCreate(Sender: TObject);    procedure shader_onClick(Sender: TObject);    procedure Timer1Timer(Sender: TObject);     procedure ResetUniforms;    procedure UpdateUniforms;    procedure RunShader;   private   public     gl_surface : IBGLTexture; shader3 : TBGLShader3D;       ctx  : TBGLContext;       cpc,ega,gboy,normal_img : boolean ;       fshader : string ; vshader : string; // fragment and vertex  end; var   Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject);begin  cpc := false;  ega := false;  gboy := false;  normal_img := false;  fshader := FragMemo.text;  vshader := VertexMemo.Text; end; procedure TForm1.ShaderScreen1Redraw(Sender: TObject; BGLContext: TBGLContext);begin   if gl_surface <> nil then     BGLContext.Canvas.StretchPutImage(0, 0, ShaderScreen1.Width, ShaderScreen1.Height, gl_surface);   if shader3 <> nil then  begin    BGLContext.Canvas.Lighting.ActiveShader := shader3;  end;end; procedure TForm1.ShaderScreen1LoadTextures(Sender: TObject; BGLContext: TBGLContext);begin   try     gl_surface := BGLTexture(ResourceFile('hybris.png'));    // Create shader    shader3 := TBGLShader3D.Create(      BGLContext.Canvas,      vshader,   // Vertex shader      fshader,   // Fragment shader      'varying vec2 texCoord;',      '130');    // Version GLSL       ctx := BGLContext;  except    on E: Exception do      raise exception.Create('Shader Error : ' + E.Message);  end;end; procedure TForm1.RunShader;begin  try    fshader := FragMemo.Text;    vshader := VertexMemo.Text;     if Assigned(shader3) then    begin      ctx.Canvas.Lighting.ActiveShader := nil;      FreeAndNil(shader3);    end;     shader3 := TBGLShader3D.Create(ctx.Canvas, vshader, fshader, 'varying vec2 texCoord;', '130');    // if shader error,  exception raised by BGRAOpenGLD3 nice :);     Timer1.Enabled := True; // timer1  except  on E: Exception do      ShowMessage('Shader Error : ' + E.Message);  end;end; procedure TForm1.ShaderScreen1UnloadTextures(Sender: TObject;  BGLContext: TBGLContext);begin  gl_surface  := nil;  FreeAndNil(shader3);  BGLContext.Canvas.Lighting.ActiveShader := nil;end; procedure TForm1.cpc_btnClick(Sender: TObject);begin      ResetUniforms;      RunShader;      cpc := true;end; procedure TForm1.ega_btnClick(Sender: TObject);begin  ResetUniforms;  RunShader;  ega := true; end; procedure TForm1.gboy_btnClick(Sender: TObject);begin  ResetUniforms;  RunShader;  gboy := true;end; procedure TForm1.shader_onClick(Sender: TObject);begin  ResetUniforms;  RunShader;  normal_img := true;end; procedure TForm1.Timer1Timer(Sender: TObject);begin  if shader3 <> nil then  begin    shader3.UniformPointF['resolution'].Value := Pointf(Round(ShaderScreen1.Width),Round(ShaderScreen1.Height));   // shader3.UniformSingle['NORMAL_IMAGE'].Value := 1.0;     shader3.UniformSingle['rez'].Value := SpinEdit1.Value;    UpdateUniforms;    ShaderScreen1.Invalidate;  end;end; procedure TForm1.ResetUniforms;begin  if shader3 <> nil then  begin    normal_img := false;    cpc := false;    ega := false;    gboy := false;   end;end; procedure TForm1.UpdateUniforms;begin  if shader3 <> nil then  begin     if ega then shader3.UniformSingle['EGA'].Value := 1.0;    if cpc then shader3.UniformSingle['CPC'].Value := 1.0;    if gboy then shader3.UniformSingle['GAMEBOY'].Value := 1.0;    if normal_img then shader3.UniformSingle['NORMAL_IMAGE'].Value := 1.0;   end;end;  end. ---------------------------------------------------------------------- Gigatron · 2025-04-10 16:23 Hi, It seems I've worked on this project before; however this one uses a pixel shader and is easier to use, so here is the latest version with support for c64, zx-spectrum, cga and msx palettes. ---------------------------------------------------------------------- Lulu · 2025-04-10 18:26 Hi, Hybris remember me its successor, Battle Squadron, which I played a lot when I was 20! ---------------------------------------------------------------------- Gigatron · 2025-04-10 18:34 Quote from: Lulu on April 10, 2025, 08:26:50 pmHi, Hybris remember me its successor, Battle Squadron, which I played a lot when I was 20!  I was shocked by this game, first the trackloader routine, then the music and finally the fluidity of the game. Vraiement impéccable