Recent

Author Topic: 8Bit Colors  (Read 590 times)

Gigatron

  • Sr. Member
  • ****
  • Posts: 334
  • Amiga Rulez !!
8Bit Colors
« on: April 10, 2025, 01:16:45 am »
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][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  9.   Spin, BGRAOpenGL, BGRABitmapTypes, BGRAOpenGL3D, BGLVirtualScreen;
  10.  
  11. type
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     ega_btn: TButton;
  16.     gboy_btn: TButton;
  17.     cpc_btn: TButton;
  18.     shader_on: TButton;
  19.     ShaderScreen1: TBGLVirtualScreen;
  20.     FragMemo: TMemo;
  21.     SpinEdit1: TSpinEdit;
  22.     Timer1: TTimer;
  23.     VertexMemo: TMemo;
  24.  
  25.     procedure cpc_btnClick(Sender: TObject);
  26.     procedure ega_btnClick(Sender: TObject);
  27.     procedure gboy_btnClick(Sender: TObject);
  28.     procedure ShaderScreen1LoadTextures(Sender: TObject; BGLContext: TBGLContext);
  29.     procedure ShaderScreen1Redraw(Sender: TObject; BGLContext: TBGLContext);
  30.     procedure ShaderScreen1UnloadTextures(Sender: TObject; BGLContext: TBGLContext);
  31.     procedure FormCreate(Sender: TObject);
  32.     procedure shader_onClick(Sender: TObject);
  33.     procedure Timer1Timer(Sender: TObject);
  34.  
  35.     procedure ResetUniforms;
  36.     procedure UpdateUniforms;
  37.     procedure RunShader;
  38.  
  39.   private
  40.  
  41.   public
  42.        gl_surface : IBGLTexture; shader3 : TBGLShader3D;
  43.        ctx  : TBGLContext;
  44.        cpc,ega,gboy,normal_img : boolean ;
  45.        fshader : string ; vshader : string; // fragment and vertex
  46.   end;
  47.  
  48. var
  49.    Form1: TForm1;
  50.  
  51. implementation
  52.  
  53. {$R *.lfm}
  54.  
  55. { TForm1 }
  56.  
  57. procedure TForm1.FormCreate(Sender: TObject);
  58. begin
  59.   cpc := false;
  60.   ega := false;
  61.   gboy := false;
  62.   normal_img := false;
  63.   fshader := FragMemo.text;
  64.   vshader := VertexMemo.Text;
  65.  
  66. end;
  67.  
  68. procedure TForm1.ShaderScreen1Redraw(Sender: TObject; BGLContext: TBGLContext);
  69. begin
  70.  
  71.   if gl_surface <> nil then
  72.      BGLContext.Canvas.StretchPutImage(0, 0, ShaderScreen1.Width, ShaderScreen1.Height, gl_surface);
  73.  
  74.   if shader3 <> nil then
  75.   begin
  76.     BGLContext.Canvas.Lighting.ActiveShader := shader3;
  77.   end;
  78. end;
  79.  
  80. procedure TForm1.ShaderScreen1LoadTextures(Sender: TObject; BGLContext: TBGLContext);
  81. begin
  82.    try
  83.      gl_surface := BGLTexture(ResourceFile('hybris.png'));
  84.     // Create shader
  85.     shader3 := TBGLShader3D.Create(
  86.       BGLContext.Canvas,
  87.       vshader,   // Vertex shader
  88.       fshader,   // Fragment shader
  89.       'varying vec2 texCoord;',
  90.       '130');    // Version GLSL
  91.        ctx := BGLContext;
  92.   except
  93.     on E: Exception do
  94.       raise exception.Create('Shader Error : ' + E.Message);
  95.   end;
  96. end;
  97.  
  98. procedure TForm1.RunShader;
  99. begin
  100.   try
  101.     fshader := FragMemo.Text;
  102.     vshader := VertexMemo.Text;
  103.  
  104.     if Assigned(shader3) then
  105.     begin
  106.       ctx.Canvas.Lighting.ActiveShader := nil;
  107.       FreeAndNil(shader3);
  108.     end;
  109.  
  110.     shader3 := TBGLShader3D.Create(ctx.Canvas, vshader, fshader, 'varying vec2 texCoord;', '130');
  111.     // if shader error,  exception raised by BGRAOpenGLD3 nice :);
  112.  
  113.     Timer1.Enabled := True; // timer1
  114.   except
  115.     on E: Exception do
  116.       ShowMessage('Shader Error : ' + E.Message);
  117.   end;
  118. end;
  119.  
  120. procedure TForm1.ShaderScreen1UnloadTextures(Sender: TObject;
  121.   BGLContext: TBGLContext);
  122. begin
  123.   gl_surface  := nil;
  124.   FreeAndNil(shader3);
  125.   BGLContext.Canvas.Lighting.ActiveShader := nil;
  126. end;
  127.  
  128. procedure TForm1.cpc_btnClick(Sender: TObject);
  129. begin
  130.       ResetUniforms;
  131.       RunShader;
  132.       cpc := true;
  133. end;
  134.  
  135. procedure TForm1.ega_btnClick(Sender: TObject);
  136. begin
  137.   ResetUniforms;
  138.   RunShader;
  139.   ega := true;
  140.  
  141. end;
  142.  
  143. procedure TForm1.gboy_btnClick(Sender: TObject);
  144. begin
  145.   ResetUniforms;
  146.   RunShader;
  147.   gboy := true;
  148. end;
  149.  
  150. procedure TForm1.shader_onClick(Sender: TObject);
  151. begin
  152.   ResetUniforms;
  153.   RunShader;
  154.   normal_img := true;
  155. end;
  156.  
  157. procedure TForm1.Timer1Timer(Sender: TObject);
  158. begin
  159.   if shader3 <> nil then
  160.   begin
  161.     shader3.UniformPointF['resolution'].Value := Pointf(Round(ShaderScreen1.Width),Round(ShaderScreen1.Height));
  162.    // shader3.UniformSingle['NORMAL_IMAGE'].Value := 1.0;
  163.  
  164.     shader3.UniformSingle['rez'].Value := SpinEdit1.Value;
  165.     UpdateUniforms;
  166.     ShaderScreen1.Invalidate;
  167.   end;
  168. end;
  169.  
  170. procedure TForm1.ResetUniforms;
  171. begin
  172.   if shader3 <> nil then
  173.   begin
  174.     normal_img := false;
  175.     cpc := false;
  176.     ega := false;
  177.     gboy := false;
  178.  
  179.   end;
  180. end;
  181.  
  182. procedure TForm1.UpdateUniforms;
  183. begin
  184.   if shader3 <> nil then
  185.   begin
  186.  
  187.     if ega then shader3.UniformSingle['EGA'].Value := 1.0;
  188.     if cpc then shader3.UniformSingle['CPC'].Value := 1.0;
  189.     if gboy then shader3.UniformSingle['GAMEBOY'].Value := 1.0;
  190.     if normal_img then shader3.UniformSingle['NORMAL_IMAGE'].Value := 1.0;
  191.  
  192.   end;
  193. end;
  194.  
  195.  
  196. end.
Trip to Europe...  20 days

Gigatron

  • Sr. Member
  • ****
  • Posts: 334
  • Amiga Rulez !!
Re: 8Bit Colors
« Reply #1 on: April 10, 2025, 06:23:20 pm »
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.

Trip to Europe...  20 days

Lulu

  • Sr. Member
  • ****
  • Posts: 331
Re: 8Bit Colors
« Reply #2 on: April 10, 2025, 08:26:50 pm »
Hi, Hybris remember me its successor, Battle Squadron, which I played a lot when I was 20!  :)
wishing you a nice life!
GitHub repositories https://github.com/Lulu04

Gigatron

  • Sr. Member
  • ****
  • Posts: 334
  • Amiga Rulez !!
Re: 8Bit Colors
« Reply #3 on: April 10, 2025, 08:34:08 pm »
Hi, 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 :)
Trip to Europe...  20 days

 

TinyPortal © 2005-2018