I've ported Guest-Dr-Venom to ReShade!

Weird it should look like this :

1 Like

Now it does. :man_shrugging:

2 Likes

Record of Lodoss War -Deedlit in Wonder Labyrinth-

PreprocessorDefinitions=Texture_Res_X=640,Texture_Res_Y=360
[email protected]
[email protected]

[CRT-Guest-Advanced.fx]
addnoise=0.000000
beam_max=1.000000
beam_min=1.300000
beam_size=0.600000
bloom=0.000000
BLOOM=0.000000
brightboost1=2.100000
brightboost2=1.400000
bsize=6000.000000
CGWG=0.300000
cgwg=0.300000
csize=0.000000
deconbx=0.000000
deconby=0.000000
decongx=0.000000
decongy=0.000000
deconrx=0.000000
deconry=0.000000
decons=0.500000
deconsmooth=0.000000
double_slot=1.000000
ei_limit=2.000000
gamma_c=1.100001
GAMMA_IN=2.400000
GAMMA_OUT=2.400000
glow=0.000000
gsl=2.000000
halation=0.000000
h_sharp=3.600010
inter=400.000000
interm=0.000000
inters=0.000000
IOS=0.000000
iscan=0.200000
lsmooth=0.700000
maskDark=0.500000
maskLight=1.500000
masksize=1.000000
mask_gamma=2.400000
mclip=0.500000
mcut=1.100000
OS=0.000000
overscanY=0.000000
prescalex=1.000000
ResolutionX=640.000000
ResolutionY=360.000000
scanline1=6.000000
scanline2=32.000000
scans=0.600000
shadowMask=-1.000000
SIGMA_H=1.200000
SIGMA_V=1.200000
SIGMA_X=0.700000
SIGMA_Y=0.700000
SIZEH=6.000000
SIZEV=6.000000
SIZEX=4.000000
SIZEY=4.000000
slotmask=0.000000
slotms=1.000000
slotwidth=2.000000
smart_ei=0.000000
spike=0.000000
sth=0.200000
s_sharp=1.000000
TATE=0.000000
Texture_Res_X=640.000000
Texture_Res_Y=360.000000
vertmask=0.000000
warpX=0.000000
warpY=0.000000

3 Likes

Is this the current version of Guest? As in V2?

1 Like

Yes. @guest.r changed the name from GDV2 to GDV-Advanced a while back.

1 Like

Just wanted to pop in and give a big thanks for porting this shader to Reshade. CRT Guest Dr Venom has been one of my favorite CRT shaders to date and now I can use it will all kinds of PC games that I wish to.

I can also combine it with 3dfx games, since 3dfx APIs such as nglide and dgvoodoo2 convert the calls to DirectX 11, which I then can combine with Reshade to add desired effects.

One interesting one, here are a couple of screenshots of POD Gold with dgvoodoo2, running with Reshade using CRT Guest Advanced. Menus are at 640x480 internal resolution with gameplay at 800x600.

I plan on testing this out with many different games I have on hand.

7 Likes

I just wanted to leave a big Thanks for this great Shader !!! All Retro systems like PS1, PS1, Dreamcast, Gamecube etc. as well as Arcade etc. look absolut great with this shader when configured properly. I can sell my 31 and 15 khz CRT’s now and play everything on my OLED as it look really CRT’ish now and doesn’t leave much to be desired. Thank you !!!

3 Likes

I think this looks pretty sweet:

2 Likes

Some Color Mangler shaders I recently ported to ReShade!

GBA Color :

uniform float DarkenScreen <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 2.0;
	ui_step = 0.05;
	ui_label = "Darken Screen";
> = 1.0;

#include "ReShade.fxh"

float4 GBAColorPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target
{
float4 screen=pow(tex2D(ReShade::BackBuffer,texcoord),2.2+DarkenScreen).rgba;
float4 avglum=0.5;
screen=lerp(screen,avglum,0.0);
float4x4 colour=float4x4(0.82,0.24,-0.06,0.0,0.125,0.665,0.21,0.0,0.195,0.075,0.73,0.0,0.0,0.0,0.0,1.0);
float4x4 adjust=float4x4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0);
colour=mul(colour,adjust);
screen=saturate(screen*0.94);
screen=mul(colour,screen);
return pow(screen,1.0/2.2);
}

technique GBAColor
{
pass
{
VertexShader=PostProcessVS;
PixelShader=GBAColorPS;
}
}

NDS Color :

uniform float DarkenScreen <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 2.0;
	ui_step = 0.05;
	ui_label = "Darken Screen";
> = 0.0;

#include "ReShade.fxh"

float4 NDSColorPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target
{
float4 screen=pow(tex2D(ReShade::BackBuffer,texcoord),2.2+DarkenScreen).rgba;
float4 avglum=0.5;
screen=lerp(screen,avglum,0.0);
float4x4 colour=float4x4(0.815,0.215,-0.12,0.0,0.07,0.62,0.22,0.0,0.075,0.155,0.77,0.0,0.0,0.0,0.0,1.0);
float4x4 adjust=float4x4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0);
colour=mul(colour,adjust);
screen=saturate(screen*0.97);
screen=mul(colour,screen);
return pow(screen,1.0/2.2);
}

technique NDSColor
{
pass
{
VertexShader=PostProcessVS;
PixelShader=NDSColorPS;
}
}

PSP Color :

uniform float DarkenScreen <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 2.0;
	ui_step = 0.05;
	ui_label = "Darken Screen";
> = 0.0;

#include "ReShade.fxh"

float4 PSPColorPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target
{
float4 screen=pow(tex2D(ReShade::BackBuffer,texcoord),2.2+DarkenScreen).rgba;
float4 avglum=0.5;
screen=lerp(screen,avglum,0.0);
float4x4 colour=float4x4(0.98,0.25,-0.18,0.0,0.04,0.795,0.165,0.0,0.01,0.01,0.98,0.0,0.0,0.0,0.0,1.0);
float4x4 adjust=float4x4(1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0);
colour=mul(colour,adjust);
screen=saturate(screen*1.0);
screen=mul(colour,screen);
return pow(screen,1.0/2.2);
}

technique PSPColor
{
pass
{
VertexShader=PostProcessVS;
PixelShader=PSPColorPS;
}
}
4 Likes

Hey I need some help using CRT-Guest-Advanced for ReShade with MAME Standalone. First, I made sure integer scaling was on and that I disabled ‘unevenstretch’.

Example: I want to play Marvel vs Capcom. The default resolution is 384x224. I know that it’s not 4:3 but it does get turned to this aspect.

What should I use for these options? My current screen is 1920x1200

Resolution x =

Resolution y =

.fx file definitions

x =

y =

I assumed both X would be 384 and both y would be 224 but I get scaling artifacts (crawling) if I try this and other settings cause blurring.

thanks.

2 Likes

Can you post some screenshots?

1 Like

Here’s one example. Notice the blurring on Free Play

It’s difficult to show without motion.

2 Likes

Oh, did you mean the integer scale option in MAME and not the one’s in the shader itself? As ReShade can’t get access to that unlike the RA version (hence also why there are parameters for ResolutionX and ResolutionY).

You need to play in your monitors full height of 1200p. For 4:3 width you have to run MAME at 1600x1200, you can try Res-O-Matic for that.

4 Likes

I constantly switch between CRT-royale and dr Venom but the latter wins for lowres for sure. Any chance of porting the “hires” version by ‘guest.r’ to Reshade?

1 Like

Any idea why the text is messed up? This pic is taken with the default settings in Guest-Dr-Venom. According to PC gaming wiki, the native resolution for Bloodstained is 426x240. I tried changing the Texture_Res_X in the .fx file to match, but it didn’t fix it. I also tried doubling the resolution, and that didn’t fix it either.

1 Like

Both axes are missing lines, so the res is too small in both directions. Perhaps it uses a different resolution in menus?

2 Likes

1st time here, and necroing this thread, but with the latest Reshade 5 update, i think it would be nice to see this added to shader repo

1 Like

NTSC-Adaptive for ReShade (with some help from @guest.r).

(Make sure Resolution X and Resolution Y are always the same size as NTSC_Adapt_X and NTSC_Adapt_Y respectively.)

Please report here if you find any bugs.

uniform float ResolutionX <
	ui_label = "Resolution X";
> = 320.0;

uniform float ResolutionY <
	ui_label = "Resolution Y";
> = 240.0;

uniform float quality <
	ui_type = "drag";
	ui_min = -1.0;
	ui_max = 2.0;
	ui_step = 1.0;
	ui_label = "NTSC Preset (SVideo=0 Composite=1 RF=2 Custom=-1)";
> = 1.0;

uniform float ntsc_fields <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 1.0;
	ui_step = 1.0;
	ui_label = "NTSC Merge Fields";
> = 0.0;

uniform float ntsc_phase <
	ui_type = "drag";
	ui_min = 1.0;
	ui_max = 3.0;
	ui_step = 1.0;
	ui_label = "NTSC Phase: Auto | 2 Phase | 3 Phase";
> = 1.0;

uniform float ntsc_scale <
	ui_type = "drag";
	ui_min = 0.20;
	ui_max = 2.25;
	ui_step = 0.05;
	ui_label = "NTSC Resolution Scaling";
> = 1.0;

uniform float ntsc_sat <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 2.0;
	ui_step = 0.01;
	ui_label = "NTSC Color Saturation";
> = 1.0;

uniform float ntsc_bright <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 1.5;
	ui_step = 0.01;
	ui_label = "NTSC Brightness";
> = 1.0;

uniform float cust_artifacting <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 5.0;
	ui_step = 0.1;
	ui_label = "NTSC Custom Artifacting Value";
> = 0.0;

uniform float cust_fringing <
	ui_type = "drag";
	ui_min = 0.0;
	ui_max = 5.0;
	ui_step = 0.1;
	ui_label = "NTSC Custom Fringing Value";
> = 0.0;

#include "ReShade.fxh"

#define TexSize float2(4.0*ResolutionX,ResolutionY)
#define IptSize float2(4.0*ResolutionX,ResolutionY)
#define SrcSize float4(TexSize,1.0/TexSize)
#define OptSize float4(IptSize,1.0/IptSize)
#define mix_mat float3x3(BRIGHTNESS,ARTIFACTING,ARTIFACTING,FRINGING,2.0*SATURATION,0.0,FRINGING,0.0,2.0*SATURATION)
#define rgb_mat float3x3(0.299,0.587,0.114,0.596,-0.274,-0.322,0.211,-0.523,0.312)
#define yiq_mat float3x3(1.000,0.956,0.621,1.000,-0.272,-0.647,1.000,-1.106,1.703)
#define tex_crd texcoord-float2(0.5/SrcSize.x,0.0)
#define fetch_offset(offset,one_x) tex2D(SamplerN,tex_crd+float2((offset)*(one_x),0.0)).xyz
#define fmod(x,y) (x-y*trunc(x/y))
#define PI 3.14159265

#ifndef NTSC_Adapt_X
#define NTSC_Adapt_X 320
#endif

#ifndef NTSC_Adapt_Y
#define NTSC_Adapt_Y 240
#endif

texture TextureN{Width=4.0*NTSC_Adapt_X;Height=NTSC_Adapt_Y;Format=RGBA16F;};
sampler SamplerN{Texture=TextureN;MinFilter=Point;MagFilter=Point;};

sampler Sampler0{Texture=ReShade::BackBufferTex;};

uniform int framecount<source="framecount";>;

float3 rgb2yiq(float3 rgb)
{
	return mul(rgb_mat, rgb);
}

float3 yiq2rgb(float3 yiq)
{
	return mul(yiq_mat, yiq);
}

float3 NTSC_1_PS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target
{
	float pix_res = min(ntsc_scale, 1.0);
	float OrgSize = SrcSize.x / 4.0;
	float phase = (ntsc_phase < 1.5) ? ((OrgSize > 300.0) ? 2.0 : 3.0) : ((ntsc_phase > 2.5) ? 3.0 : 2.0);
	float res = ntsc_scale;

	float mod1 = 2.0;
	float mod2 = 3.0;

	float CHROMA_MOD_FREQ = (phase < 2.5) ? (4.0 * PI / 15.0) : (PI / 3.0);
	float ARTIFACTING = (quality > -0.5) ? quality : cust_artifacting;
	float SATURATION = ntsc_sat;
	float BRIGHTNESS = ntsc_bright;
	float FRINGING = (quality > -0.5) ? quality : cust_fringing;

	float MERGE;

	MERGE = (int(quality) ==  2 || phase < 2.5) ? 0.0 : 1.0;
	MERGE = (int(quality) == -1) ? ntsc_fields : MERGE;

	float2 pix_no = texcoord * SrcSize.xy * (pix_res * OptSize.xy / SrcSize.xy);

	float3 col = tex2D(Sampler0, texcoord).rgb;

	float3 yiq1 = rgb2yiq(col);
	float3 yiq2 = yiq1;	
	float3 yiqs = yiq1;
	float3 yiqz = yiq1;

if (MERGE > 0.5)
{
	float chroma_phase2 = (phase < 2.5) ? PI * (fmod(pix_no.y, mod1) + fmod(framecount+1, 2.)) : 0.6667 * PI * (fmod(pix_no.y, mod2) + fmod(framecount+1, 2.));
	float mod_phase2 = chroma_phase2 + pix_no.x * CHROMA_MOD_FREQ;

	float i_mod2 = cos(mod_phase2);
	float q_mod2 = sin(mod_phase2);

	yiq2.yz *= float2(i_mod2, q_mod2);
	yiq2 = mul(mix_mat, yiq2);
	yiq2.yz *= float2(i_mod2, q_mod2);

if (res > 1.025)
{
	mod_phase2 = chroma_phase2 + pix_no.x * CHROMA_MOD_FREQ * res;

	i_mod2 = cos(mod_phase2);
	q_mod2 = sin(mod_phase2);

	yiqs.yz *= float2(i_mod2, q_mod2);
	yiq2.x = dot(yiqs, mix_mat[0]);
}
}

	float chroma_phase1 = (phase < 2.5) ? PI * (fmod(pix_no.y, mod1) + fmod(framecount, 2.)) : 0.6667 * PI * (fmod(pix_no.y, mod2) + fmod(framecount, 2.));
	float mod_phase1 = chroma_phase1 + pix_no.x * CHROMA_MOD_FREQ;

	float i_mod1 = cos(mod_phase1);
	float q_mod1 = sin(mod_phase1);

	yiq1.yz *= float2(i_mod1, q_mod1);
	yiq1 = mul(mix_mat, yiq1);
	yiq1.yz *= float2(i_mod1, q_mod1);

if (res > 1.025)
{
	mod_phase1 = chroma_phase1 + pix_no.x * CHROMA_MOD_FREQ * res;

	i_mod1 = cos(mod_phase1);
	q_mod1 = sin(mod_phase1);

	yiqz.yz *= float2(i_mod1, q_mod1);
	yiq1.x = dot(yiqz, mix_mat[0]);
}

	yiq1 = (MERGE < 0.5) ? yiq1 : 0.5*(yiq1+yiq2);

	return float4(yiq1, 1.0);
}

float3 NTSC_2_PS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target
{
	const float chroma_filter_2_phase[33] = {
    0.001384762, 0.001678312, 0.002021715, 0.002420562, 0.002880460, 0.003406879, 0.004004985, 0.004679445, 0.005434218, 0.006272332, 0.007195654,
    0.008204665, 0.009298238, 0.010473450, 0.011725413, 0.013047155, 0.014429548, 0.015861306, 0.017329037, 0.018817382, 0.020309220, 0.021785952,
    0.023227857, 0.024614500, 0.025925203, 0.027139546, 0.028237893, 0.029201910, 0.030015081, 0.030663170, 0.031134640, 0.031420995, 0.031517031};

	const float chroma_filter_3_phase[25] = {
   -0.000118847,-0.000271306,-0.000502642,-0.000930833,-0.001451013,
   -0.002064744,-0.002700432,-0.003241276,-0.003524948,-0.003350284,
   -0.002491729,-0.000721149, 0.002164659, 0.006313635, 0.011789103,
    0.018545660, 0.026414396, 0.035100710, 0.044196567, 0.053207202,
    0.061590275, 0.068803602, 0.074356193, 0.077856564, 0.079052396};

	const float luma_filter_2_phase[33] = {
   -0.000174844,-0.000205844,-0.000149453,-0.000051693, 0.000000000,-0.000066171,-0.000245058,-0.000432928,-0.000472644,-0.000252236, 0.000198929,
    0.000687058, 0.000944112, 0.000803467, 0.000363199, 0.000013422, 0.000253402, 0.001339461, 0.002932972, 0.003983485, 0.003026683,-0.001102056,
   -0.008373026,-0.016897700,-0.022914480,-0.021642347,-0.008863273, 0.017271957, 0.054921920, 0.098342579, 0.139044281, 0.168055832, 0.178571429};

	const float luma_filter_3_phase[25] = {
   -0.000012020,-0.000022146,-0.000013155,-0.000012020,-0.000049979,
   -0.000113940,-0.000122150,-0.000005612, 0.000170516, 0.000237199,
    0.000169640, 0.000285688, 0.000984574, 0.002018683, 0.002002275,
   -0.000909882,-0.007049081,-0.013222860,-0.012606931, 0.002460860,
    0.035868225, 0.084016453, 0.135563500, 0.175261268, 0.190176552};

	const int TAPS_2_phase = 32;

	const int TAPS_3_phase = 24;

	float OrgSize = SrcSize.x / 4.0;
	float phase = (ntsc_phase < 1.5) ? ((OrgSize > 300.0) ? 2.0 : 3.0) : ((ntsc_phase > 2.5) ? 3.0 : 2.0);
	float res = ntsc_scale;
	float one = SrcSize.z / res;

	float3 signal;

if (phase < 2.5)
{
	for (int i = 0; i < TAPS_2_phase; i++)
	{
	float offset = float(i);

	float3 sums = fetch_offset(offset - float(TAPS_2_phase), one) + fetch_offset(float(TAPS_2_phase) - offset, one);

	signal += sums * float3(luma_filter_2_phase[i], chroma_filter_2_phase[i], chroma_filter_2_phase[i]);
	}

	signal += tex2D(SamplerN, tex_crd).xyz * float3(luma_filter_2_phase[TAPS_2_phase], chroma_filter_2_phase[TAPS_2_phase], chroma_filter_2_phase[TAPS_2_phase]);}else

if (phase > 2.5)
{
	for (int i = 0; i < TAPS_3_phase; i++)
	{
	float offset = float(i);

	float3 sums = fetch_offset(offset - float(TAPS_3_phase), one) + fetch_offset(float(TAPS_3_phase) - offset, one);

	signal += sums * float3(luma_filter_3_phase[i], chroma_filter_3_phase[i], chroma_filter_3_phase[i]);
	}

	signal += tex2D(SamplerN, tex_crd).xyz * float3(luma_filter_3_phase[TAPS_3_phase], chroma_filter_3_phase[TAPS_3_phase], chroma_filter_3_phase[TAPS_3_phase]);}

	float3 rgb = yiq2rgb(signal);

	return float4(rgb, 1.0);
}

technique NTSC_Adaptive
{
pass NTSC_Pass_1
{
VertexShader=PostProcessVS;
PixelShader=NTSC_1_PS;
RenderTarget=TextureN;
}
pass NTSC_Pass_2
{
VertexShader=PostProcessVS;
PixelShader=NTSC_2_PS;
}
}

Some shots with CRT-Geom on top :

8 Likes

Hi, I realized that the latest version of the CRT-Guest-Advanced port is not in the first post, can you point me in the direction of the latest version please?

Also, can you give me a quick description of the installation steps for your shaders please?

I’ve used ReShade before but only installed it a few times so I might just need a quick refresher.

I would like to create my own preset for TMNT: Shredder’s Revenge. Haven’t found the native resolution on PC Gaming Wiki.

I’m going to start winging it but any assistance would be greatly appreciated.

1 Like

That’s the most latest (over a year old) version of GDV-Advanced ReShade port. Just copy and save it as a .fx text file.

(I’ll be able to help you more in the morning as I’m currently preparing to go to sleep.)

1 Like