PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SNES +Pixel Shader


DaBrain
2005-09-29, 16:31:54
Ich habe mal eine kleine Bitte an die SNES Fans mit ATI Grafikkarten.

Mich würde es mal brennend interessieren wie gut SNES Spiele mit Smart Shader Postfiltern aussehen. (HDRish, comic, Motion Blur, usw.)

SNES9x hat doch einen OpenGL Grafikmodus mit dem das möglich sein sollte.

Ich kann mir gut vorstellen, dass dunklere Spiele mit starken Hell-Dunkel Kontrasten ziemlich gut damit aussehen müssten. ;)


Im 3D Bereich sind Postfilter ja teilweise nicht so beliebt... Naja 3d + 2d Filter...

Lightning
2005-09-29, 17:59:32
Nunja, es funktioniert mit SNES9x, soviel kann ich sagen.

Nicht sagen kann ich dir allerdings, ob du das schön finden wirst. Ich persönlich kann dem Ganzen, gerade HDRish, nichts abgewinnen, egal ob in 3D- oder 2D-Spielen. Es sieht imho einfach falsch und schlecht aus, auch wenn man den Effekt deutlich abschwächt.

Mr. Lolman
2005-09-30, 11:52:38
Nunja, es funktioniert mit SNES9x, soviel kann ich sagen.

Nicht sagen kann ich dir allerdings, ob du das schön finden wirst. Ich persönlich kann dem Ganzen, gerade HDRish, nichts abgewinnen, egal ob in 3D- oder 2D-Spielen. Es sieht imho einfach falsch und schlecht aus, auch wenn man den Effekt deutlich abschwächt.

Imo kann HDRish schon ganz gut aussehen...
http://img287.imageshack.us/img287/4499/ut99hdr20mw5mn.jpg (http://imageshack.us)

Lightning
2005-09-30, 15:25:56
Imo kann HDRish schon ganz gut aussehen...
http://img287.imageshack.us/img287/4499/ut99hdr20mw5mn.jpg

Und imho eben nicht, auch nicht bei deinem Shot (es wirkt auf mich einfach ausgeblichen). Aber das ist hier doch überhaupt nicht Thema.

DaBrain
2005-09-30, 15:33:19
Nunja, es funktioniert mit SNES9x, soviel kann ich sagen.

Nicht sagen kann ich dir allerdings, ob du das schön finden wirst. Ich persönlich kann dem Ganzen, gerade HDRish, nichts abgewinnen, egal ob in 3D- oder 2D-Spielen. Es sieht imho einfach falsch und schlecht aus, auch wenn man den Effekt deutlich abschwächt.

Wie wäre es mal mit einem Screenshot? ;D

Lightning
2005-09-30, 19:59:53
Wie wäre es mal mit einem Screenshot? ;D

Könnte ich machen, kein Problem. Irgendwelche speziellen Spielewünsche?

Mantikor
2005-09-30, 20:35:12
Könnte ich machen, kein Problem. Irgendwelche speziellen Spielewünsche?

Starwing! :)

Mfg der Mantikor

DaBrain
2005-09-30, 21:08:30
Ich würde ja Secret of Mana sagen, aber das ist wahrscheinlich viel zu hell. (Da müsste man den Effekt stark anpassen...)

Vielleicht Illusion of Time oder eine dunkle Stelle in Terranigma. :)

hofmetzger
2005-09-30, 21:09:04
ich könnte mir secret of mana sehr gut damit vorstellen... schade dass ich keine ati habe...

DaBrain
2005-09-30, 21:50:17
Man müsste den Gaussradius auf hmm so 25% runterstellen und die Stärke auf 50% reduzieren. Und am besten noch die Helligkeit runterdrehen. ;D

Lightning
2005-10-01, 12:01:21
Hier mal ein paar Testbilder von Rock n' Roll Racing, Starwing und Secret of Mana. Ich habe jetzt erstmal nur die Intensität des Leuchtens auf 35% reduziert (mit MAD result.color, blur, 0.35, back; ). Ist vielleicht nicht optimal, und mehr Einstellungsmöglichkeiten sind mir auch nicht bekannt. Gebt mir präzisere Wünsche, und ich kann noch was anderes ausprobieren.

edit: Ups, ich hätte die Bilder ruhig etwas verkleinern können, fällt mir gerade auf. X-D Naja, beim nächsten Mal.


http://mitglied.lycos.de/lightning27/Screens/rockroll.jpg

http://mitglied.lycos.de/lightning27/Screens/starwing.jpg

http://mitglied.lycos.de/lightning27/Screens/som1.jpg

DaBrain
2005-10-01, 14:22:23
Danke für die Bilder. ;)

Hatte schon befürchet dass es so aussieht...

Mich würde noch der "Watercolour + Ink Outline" Shader und dieser Shader interessieren. Der erste in normalen Szenen, der zweite in dunklen Szenen. ;)


shader samplePixelShader =
"!!ARBfp1.0

TEMP Temp;

TEX result.color, fragment.texcoord[0], texture[0], 2D;

END";

shader gaussianXPixelShader =
"!!ARBfp1.0

PARAM Offset[11]={ program.local[0..10] };

PARAM Weight[3]=
{
{ 0.182008, 0.116053, 0.073999, 0.047184 },
{ 0.030086, 0.019183, 0.012232, 0.007799 },
{ 0.004973, 0.003171, 0.002022, 0.001289 }
};

TEMP s0, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10;

ADD r0, -Offset[10], fragment.texcoord[0];
ADD r1, -Offset[ 9], fragment.texcoord[0];
ADD r2, -Offset[ 8], fragment.texcoord[0];
ADD r3, -Offset[ 7], fragment.texcoord[0];
ADD r4, -Offset[ 6], fragment.texcoord[0];
ADD r5, -Offset[ 5], fragment.texcoord[0];
ADD r6, -Offset[ 4], fragment.texcoord[0];
ADD r7, -Offset[ 3], fragment.texcoord[0];
ADD r8, -Offset[ 2], fragment.texcoord[0];
ADD r9, -Offset[ 1], fragment.texcoord[0];
ADD r10, -Offset[ 0], fragment.texcoord[0];
MOV s0, fragment.texcoord[0];

TEX r0, r0, texture[0], 2D;
TEX r1, r1, texture[0], 2D;
TEX r2, r2, texture[0], 2D;
TEX r3, r3, texture[0], 2D;
TEX r4, r4, texture[0], 2D;
TEX r5, r5, texture[0], 2D;
TEX r6, r6, texture[0], 2D;
TEX r7, r7, texture[0], 2D;
TEX r8, r8, texture[0], 2D;
TEX r9, r9, texture[0], 2D;
TEX r10, r10, texture[0], 2D;

TEX s0, s0, texture[0], 2D;

MUL s0, s0, Weight[0].x;
MAD s0, r0, Weight[2].w, s0;
MAD s0, r1, Weight[2].z, s0;
MAD s0, r2, Weight[2].y, s0;
MAD s0, r3, Weight[2].x, s0;
MAD s0, r4, Weight[1].w, s0;
MAD s0, r5, Weight[1].z, s0;
MAD s0, r6, Weight[1].y, s0;
MAD s0, r7, Weight[1].x, s0;
MAD s0, r8, Weight[0].w, s0;
MAD s0, r9, Weight[0].z, s0;
MAD s0, r10, Weight[0].y, s0;

ADD r0, Offset[ 0], fragment.texcoord[0];
ADD r1, Offset[ 1], fragment.texcoord[0];
ADD r2, Offset[ 2], fragment.texcoord[0];
ADD r3, Offset[ 3], fragment.texcoord[0];
ADD r4, Offset[ 4], fragment.texcoord[0];
ADD r5, Offset[ 5], fragment.texcoord[0];
ADD r6, Offset[ 6], fragment.texcoord[0];
ADD r7, Offset[ 7], fragment.texcoord[0];
ADD r8, Offset[ 8], fragment.texcoord[0];
ADD r9, Offset[ 9], fragment.texcoord[0];
ADD r10, Offset[10], fragment.texcoord[0];

TEX r0, r0, texture[0], 2D;
TEX r1, r1, texture[0], 2D;
TEX r2, r2, texture[0], 2D;
TEX r3, r3, texture[0], 2D;
TEX r4, r4, texture[0], 2D;
TEX r5, r5, texture[0], 2D;
TEX r6, r6, texture[0], 2D;
TEX r7, r7, texture[0], 2D;
TEX r8, r8, texture[0], 2D;
TEX r9, r9, texture[0], 2D;
TEX r10, r10, texture[0], 2D;

MAD s0, r0, Weight[0].y, s0;
MAD s0, r1, Weight[0].z, s0;
MAD s0, r2, Weight[0].w, s0;
MAD s0, r3, Weight[1].x, s0;
MAD s0, r4, Weight[1].y, s0;
MAD s0, r5, Weight[1].z, s0;
MAD s0, r6, Weight[1].w, s0;
MAD s0, r7, Weight[2].x, s0;
MAD s0, r8, Weight[2].y, s0;
MAD s0, r9, Weight[2].z, s0;
MAD s0, r10, Weight[2].w, s0;

MOV result.color, s0;

END";

shader gaussianYPixelShader =
"!!ARBfp1.0

PARAM Offset[11]={ program.local[0..10] };

PARAM Weight[3]=
{
{ 0.182008, 0.116053, 0.073999, 0.047184 },
{ 0.030086, 0.019183, 0.012232, 0.007799 },
{ 0.004973, 0.003171, 0.002022, 0.001289 }
};

TEMP s0, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10;

ADD r0, -Offset[10], fragment.texcoord[0];
ADD r1, -Offset[ 9], fragment.texcoord[0];
ADD r2, -Offset[ 8], fragment.texcoord[0];
ADD r3, -Offset[ 7], fragment.texcoord[0];
ADD r4, -Offset[ 6], fragment.texcoord[0];
ADD r5, -Offset[ 5], fragment.texcoord[0];
ADD r6, -Offset[ 4], fragment.texcoord[0];
ADD r7, -Offset[ 3], fragment.texcoord[0];
ADD r8, -Offset[ 2], fragment.texcoord[0];
ADD r9, -Offset[ 1], fragment.texcoord[0];
ADD r10, -Offset[ 0], fragment.texcoord[0];
MOV s0, fragment.texcoord[0];

TEX r0, r0, texture[0], 2D;
TEX r1, r1, texture[0], 2D;
TEX r2, r2, texture[0], 2D;
TEX r3, r3, texture[0], 2D;
TEX r4, r4, texture[0], 2D;
TEX r5, r5, texture[0], 2D;
TEX r6, r6, texture[0], 2D;
TEX r7, r7, texture[0], 2D;
TEX r8, r8, texture[0], 2D;
TEX r9, r9, texture[0], 2D;
TEX r10, r10, texture[0], 2D;

TEX s0, s0, texture[0], 2D;

MUL s0, s0, Weight[0].x;
MAD s0, r0, Weight[2].w, s0;
MAD s0, r1, Weight[2].z, s0;
MAD s0, r2, Weight[2].y, s0;
MAD s0, r3, Weight[2].x, s0;
MAD s0, r4, Weight[1].w, s0;
MAD s0, r5, Weight[1].z, s0;
MAD s0, r6, Weight[1].y, s0;
MAD s0, r7, Weight[1].x, s0;
MAD s0, r8, Weight[0].w, s0;
MAD s0, r9, Weight[0].z, s0;
MAD s0, r10, Weight[0].y, s0;

ADD r0, Offset[ 0], fragment.texcoord[0];
ADD r1, Offset[ 1], fragment.texcoord[0];
ADD r2, Offset[ 2], fragment.texcoord[0];
ADD r3, Offset[ 3], fragment.texcoord[0];
ADD r4, Offset[ 4], fragment.texcoord[0];
ADD r5, Offset[ 5], fragment.texcoord[0];
ADD r6, Offset[ 6], fragment.texcoord[0];
ADD r7, Offset[ 7], fragment.texcoord[0];
ADD r8, Offset[ 8], fragment.texcoord[0];
ADD r9, Offset[ 9], fragment.texcoord[0];
ADD r10, Offset[10], fragment.texcoord[0];

TEX r0, r0, texture[0], 2D;
TEX r1, r1, texture[0], 2D;
TEX r2, r2, texture[0], 2D;
TEX r3, r3, texture[0], 2D;
TEX r4, r4, texture[0], 2D;
TEX r5, r5, texture[0], 2D;
TEX r6, r6, texture[0], 2D;
TEX r7, r7, texture[0], 2D;
TEX r8, r8, texture[0], 2D;
TEX r9, r9, texture[0], 2D;
TEX r10, r10, texture[0], 2D;

MAD s0, r0, Weight[0].y, s0;
MAD s0, r1, Weight[0].z, s0;
MAD s0, r2, Weight[0].w, s0;
MAD s0, r3, Weight[1].x, s0;
MAD s0, r4, Weight[1].y, s0;
MAD s0, r5, Weight[1].z, s0;
MAD s0, r6, Weight[1].w, s0;
MAD s0, r7, Weight[2].x, s0;
MAD s0, r8, Weight[2].y, s0;
MAD s0, r9, Weight[2].z, s0;
MAD s0, r10, Weight[2].w, s0;

MOV result.color, s0;

END";

shader outputPixelShader =
"!!ARBfp1.0

TEMP back, blur;

TEX blur, fragment.texcoord[0], texture[0], 2D;
TEX back, fragment.texcoord[0], texture[1], 2D;

ADD blur, blur, blur;
MAD result.color, blur, 0.75, back;

END";

surface blur0 = allocsurf(width/4, height/4);
surface blur1 = allocsurf(width/4, height/4);

gaussianXPixelShader.constant[ 0] = { (2.0*ds_dx)* 1.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 1] = { (2.0*ds_dx)* 3.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 2] = { (2.0*ds_dx)* 5.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 3] = { (2.0*ds_dx)* 7.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 4] = { (2.0*ds_dx)* 9.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 5] = { (2.0*ds_dx)*11.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 6] = { (2.0*ds_dx)*13.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 7] = { (2.0*ds_dx)*15.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 8] = { (2.0*ds_dx)*17.45, 0, 0, 0 };
gaussianXPixelShader.constant[ 9] = { (2.0*ds_dx)*19.45, 0, 0, 0 };
gaussianXPixelShader.constant[10] = { (2.0*ds_dx)*21.45, 0, 0, 0 };

gaussianYPixelShader.constant[ 0] = { 0, (2.0*dt_dy)* 1.45, 0, 0 };
gaussianYPixelShader.constant[ 1] = { 0, (2.0*dt_dy)* 3.45, 0, 0 };
gaussianYPixelShader.constant[ 2] = { 0, (2.0*dt_dy)* 5.45, 0, 0 };
gaussianYPixelShader.constant[ 3] = { 0, (2.0*dt_dy)* 7.45, 0, 0 };
gaussianYPixelShader.constant[ 4] = { 0, (2.0*dt_dy)* 9.45, 0, 0 };
gaussianYPixelShader.constant[ 5] = { 0, (2.0*dt_dy)*11.45, 0, 0 };
gaussianYPixelShader.constant[ 6] = { 0, (2.0*dt_dy)*13.45, 0, 0 };
gaussianYPixelShader.constant[ 7] = { 0, (2.0*dt_dy)*15.45, 0, 0 };
gaussianYPixelShader.constant[ 8] = { 0, (2.0*dt_dy)*17.45, 0, 0 };
gaussianYPixelShader.constant[ 9] = { 0, (2.0*dt_dy)*19.45, 0, 0 };
gaussianYPixelShader.constant[10] = { 0, (2.0*dt_dy)*21.45, 0, 0 };

texture[0].magfilter = "linear";

texture[0].source = backbuffer;
destination blur0;
apply samplePixelShader;

texture[0].source = blur0;
destination blur1;
apply gaussianXPixelShader;

texture[0].source = blur1;
destination blur0;
apply gaussianYPixelShader;

texture[0].source = blur0;
texture[1].source = backbuffer;
destination backbuffer;
apply outputPixelShader;