ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4369840
Jetzt (Chat):
10 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-
"Per-Pixel Dot3 Environment-Mapping" von (hWnd)


Hallo zusammen!

Hier seht ihr einen Effekt, den ich mit EffectEdit (vom DX9SDK) gecoded habe.
Er soll euch zeigen, dass Shader nicht nur "wer braucht sowas", "viel zu umständlich" oder "meine hw kanns nit, also benutz ich auch keine" sind. :)

Das Modell:
-8686 Tris
-1 Directional Light

Der Effekt hat folgende Features
-Per Pixel Cubic Environment-Mapping
-Per Pixel Lighting (Diffuse/Specular)

Viele von Euch werden jetzt bestimmt denken "Environment-Mapping ist doch immer Per-Pixel", aber das stimmt nicht, weil die Textur-Koordinaten für die Env-Map (Glance-Vektoren) üblicherweise im Vertexshader berechnet werden. Hier werden die Glance-Vektoren im Pixelshader berechnet. Das macht die Sache etwas runder. Außerdem hat man dann die Möglichkeit die Pixel-Normalen mit einer Bumpmap zu modifizieren. Dann werden auch noch die ganzen Lighting Ops (Diffuse: Lambert, Specular: Phong) im Pixelshader berechnet.

Das ganze läuft bei 1280x1024, 4xMultiSample, bei 178 FPS!

Der Effekt:

Code:
string XFile = \"bigship1.x\";

float4x4 WorldView : WORLDVIEW;
float4x4 View : VIEW;
float4x4 Projection : PROJECTION;
float4x4 WorldViewProjection : WORLDVIEWPROJECTION;

float3 LightDir ;

float Time : TIME;

int BCLR = 0;

texture BumpMap < string name = \"normal.bmp\";>;
texture EnvironMap < string type = \"CUBE\"; string name = \"lobbycube.dds\";>;

struct VS_OUTPUT_2_0
{
    float4 Pos : POSITION;
    float2 Tex : TEXCOORD0;
    float4 PPos : TEXCOORD1;
    float3 PNorm : TEXCOORD2;
};

VS_OUTPUT_2_0 VShader_2_0(float3 Pos : POSITION,
                  float3 Normal : NORMAL,
                  float3 Tex : TEXCOORD0)
{
    VS_OUTPUT_2_0 Out = (VS_OUTPUT_2_0)0;

    Out.PNorm = normalize(mul(Normal,WorldView));
    Out.PPos = mul(float4(Pos,1), WorldView);
    Out.Pos = mul(Out.PPos, Projection);
    
    Out.Tex = Tex;

    return Out;
}

sampler Bump = sampler_state
{
    Texture = ;
    MipFilter = Anisotropic;
    MagFilter = Anisotropic;
    MinFIlter = Anisotropic;
};

sampler Environ = sampler_state
{
    Texture = ;
    MipFilter = Anisotropic;
    MagFilter = Anisotropic;
    MinFIlter = Anisotropic;
};

float4 PShader_2_0(VS_OUTPUT_2_0 In) : COLOR0
{
    float3 P = normalize(In.PPos);
    float3 N = normalize(tex2D(Bump, In.Tex*4) * normalize(In.PNorm));
    float3 V = -normalize(P);   
    float3 L = -normalize(LightDir);     
             
    float3 R = normalize(2 * dot(N, L) * N - L);     
    float3 G = normalize(2 * dot(N, V) * N - V); 

    float4 Diff = 0.2 * max(0, dot(N, L)) ;
    float4 Spec = 0.8 * max(0, pow(dot(R, V),8));

    float4 Glance = texCUBE(Environ, -G);
 
    return Glance + Spec + Diff;
}

technique t0
{
    pass p0
    {
        VertexShader = compile vs_2_0 VShader_2_0();
        PixelShader = compile ps_2_0 PShader_2_0();
    }
}


Ihr könnt damit anstellen was ihr wollt aber habt Acht: Wenn ihr kein ps_2_0 habt dann müsst ihr es übers REF emulieren!
Vielleicht findet ja einer von Euch raus, wie man das auf älterer Hardware mit mehr Passes machen kann :)

Natürlich gibt es auch noch viel zu optimieren, aber ich will euch ja den Spaß lassen :)

Noch Daten zu meinem System
- Radeon 9700
- Pentium 4 2,533@2,926 ;)
- 512 MB DDR (@380 MHz) RAM

PS: Shader Rulen! :D
PPS: Vielleicht bekommt Ihr von mir bald ein Shader/Effect Tutorial zu sehen!

Gruß,
Florian Beye (hWnd)






Von Richard Schubert am 09.04.2003, 07:00:18 Uhr
Zitat:
"meine hw kanns nit, also benutz ich auch keine"


das find ich jetz nen bisserl gemein... solln wir jetz im REF proggen nur weil du der ansicht bist, das müssen jetz alle benutzen?

ansonsten siehts recht schnieke aus!

achja ... Environment-Bumpmapping gibt es erst seit GF3

Von TomCat am 09.04.2003, 08:47:38 Uhr
Hi,

das Modell gefällt mir sehr gut. Es erinnert mich irgendwie an diese glänzenden Blechtannenzapfen, die man an den Christbaum hängt. :D

Apropo Hardware: Das Ganze lässt sich wohl nur noch mit einem P4 3.5 GHZ und einer Gainward GF Fx/1000 steigern.;)



Von hWnd am 09.04.2003, 09:07:08 Uhr
Hi!

Erstmal thx für die Komplimente.

Ich bin der Auffassung, dass ein Entwickler immer schon die Features unterstützen sollte, die erst 1-1,5 Jahren in Kommerziellen Spielen vorhanden sind. Natürlich kann man diesen Effekt auch in mehreren Passes auf alter hardware hinbekommen - keine Frage. Aber ich finde es eigentlich schade dass, einige hier noch so konservativ sind.

Vielleicht sähe eure Meinung nach einem Effekt-Tutorial von mir anders aus :)
Wenn ein allgemeines Interesse bestünde, ließe sich sowas ja mal einrichten :)

PS: Ich habe vergessen zu erwähnen wo ihr die Normal-map herbekommt:

[url]http://users.ox.ac.uk/~univ1234/tutorials/simplebump/simplebump.htm
[/url]

Die Textur unterm Abschnitt "Normal-Maps" schmeißt ihr dann einfach in den Media-Ordner vom SDK, wo auch schon die anderen Texturen und modelle drin sind.

Von ONeinONeill am 09.04.2003, 12:04:54 Uhr
Schaut jut aus. Gefällt mir!

Von Alte Oma mit Kinderwagen am 09.04.2003, 13:01:11 Uhr
sehr gut
aber halt etwas aufwendig für alte grakas(wie meine)

kommt dieses raumschiff aus starwars?

die textur erinnert stark an einen basketball, nur die farbe ist nicht so typisch
hast du für die textur einen bball aufgeschnitten und gescannt?;-)

Von hWnd am 09.04.2003, 13:21:42 Uhr
@Oma
Nene, die Textur kannst du auf der oben angegebenen Seite herunterladen :)
Die Environment-Map und das Modell sind aus dem SDK.

Und was alte Hardware angeht: Ich arbeite daran, es abwärtskompatibel zu machen.

Von Tanubi am 09.04.2003, 16:19:10 Uhr
Du hast in deinem Vertex-Shader
Code:
float3 P = normalize(In.PPos);
...
float3 V = -normalize(P);

Muss das zweite Normalisieren noch sein? P ist doch schon normalisiert, oder net? Ein
Code:
float3 V = -P;

würde's doch au tun.

blutigerAnfaenger

Von hWnd am 09.04.2003, 16:49:16 Uhr
@blutigeranfänger

Jo stimmt :D

Ich sagte ja es gibt noch viel zu optimieren :)

Von Richard Schubert am 09.04.2003, 17:56:14 Uhr


jo.. ich würde auch gern mit pixelshadern arbeiten, kann mir aber ne neue Graka nit leisten... geschweige denn ein neues system das eigentlich notwendig ist... und das geht sicherlich nicht nur mir so....

und bin mal gespannt wie nen flitzebogen wie du EnvironmentBumpmapping auf ner GF2 hinbekommst....

Von ONeinONeill am 09.04.2003, 21:12:53 Uhr
Wie wäre es mit ner demo für die, die ne gute Graka haben! :D

Von Return FALSE am 09.04.2003, 21:42:54 Uhr
Total scharf!

ich würd jedenfalls ein tut, wo das mathe zeugs erkärt wird begrüssen :)

ich hab erst so wellen mit cube mapping mit vs und ps gemacht. Eben, ich hab jetzt das verschissn* problem mit dem cube map rendern... könntest du mal im forum danach gucken, evtl weisst du weiter, irgendwie scheint hier niemand ahnung von cube mapping zu haben :)

ist jetzt das die high-ended shader language von dx9?

sieht ungeheuer ähnlich aus wie CG :), ich hab bis jetzt nur mit CG geshadert. Aber dieser Shader läuft doch auch unter vs & ps 1.1, oder? was wird z.B nicht unterstützt... dann liefe es auch auf meiner geforce3 ti.

sowiso zu sachen hardware :) du machst das genau richtig... ich tue mir das nicht an, meine engine für jeden schrott kompatibel zu machen, das gibt ne menge arbeit, und eh man sich versieht, war alles für nix, weils die karten nicht mehr gibt. demnächst wird in meiner engine das ganze TnL fixed pipeline zeugs durch shaders ersetzt. Bis jetzt hatte ich mind. ne GF2mx als anspruch, aber schlussendlich wird ne gf3 ti das mindeste aller gefühle sein. Immerhin will ich, und nicht nur ich :) dynamisches grass im terrain haben, welches vom wind gestreift wird, und die sonne reflektiert :D eh, scheiss auf die alte hardware, bringt es so schnell wie möglich auf die spitze!!! also... :) meine gf3ti ist auch grufti, werd ich auch bei zeiten ersetzten.

frage: hättest du ne idee wie ich ein shader für den lensflare schreiben kann, das er merkt ob ein gegenstand zwischen licht und kamera liegt? Mit der annahme das das pixel genau weiss sein muss... vs1.1 unterstützt kein if :D

Gruss
TömS (Return FALSE)

Von hWnd am 09.04.2003, 22:42:05 Uhr
Hi Return FALSE
Schön, dass endlich mal jemand meine Meinung vertritt :D

Mal schauen, was ich bei deinem CubeMapping-problem machen kann..
muss aber erstmal den Thread finden :)

Ja, dass ist die HLSL, hier sogar noch etwas erweitert als Effect.
Das selbe gibts von NVIDIA auch, heißt CgFX. Das dingens ist aber noch
im Beta-Stadium im gegensatz zu den DX9 Effects.

Dieser Effekt läuft momentan nur mit vs_1_1/ps_2_0. ich arbeite aber
gerade daran eine vs_1_1/ps_1_1 version davon zu schreiben, also stay tuned :D

Mit lens-flares habe ich mich bisher noch nicht auseinandergesetzt,
aber es wird sicherlich möglich sein, da was mit shadern zu machen.

cu
hWnd

Von Azrael|jitd am 09.04.2003, 22:58:38 Uhr
Auf http://www.cgshaders.org/ gibts soweit ich weiß eine collision shader.. vielleicht hilft dir das bei dem lansflare weiter
habs mir selbst noch nicht ageguckt
benutzt ihr alle nur direct X oder gibts hier auch leute die cg mit opengl über cg-runtime machen?
Hab dafür jetzt mal nen parser für eigene effekt files geschrieben.. ist aber etwas anders aufgebaut als CgFX

Von Return FALSE am 10.04.2003, 08:27:59 Uhr
Die CG-Runtime find ich nicht so gut, zumindest den d3d teil davon, wie's unter ogl ist kann ich jetzt nicht beurteilen.

@hWnd
was kann ps1.1 denn da noch nicht? mir ist da noch nichts aufgefallen.

Von hWnd am 10.04.2003, 10:30:30 Uhr
Tja, das hab ich mir auch gedacht, aber seltsamerweise kann ich in ps_1_1 nicht normalisieren, obwohl das doch theorethisch möglich sein müsste, oder ?

Von Return FALSE am 10.04.2003, 11:54:46 Uhr
und ob das möglich ist :)
bei CG funkt das. hm, gibts sowas wie "inline assembler" für die Shadersprachen, bei denen man teile selber coden kann? normalisieren könntest du so einfach, aber eh, ich glaub nicht, das sie das nicht haben.

Von hWnd am 10.04.2003, 13:01:55 Uhr
In der HLSL gehts nicht.. ich werde den Shader nochmal komplett in asm schreiben :D

Von Lotze am 17.04.2003, 18:48:37 Uhr
Moin,
das Bild sieht echt geil aus!
Leider versteh ich NULL , was ihr hier redet!

Ich will auch ein Tuto =)

mfG lotze

Von Timetwister am 27.04.2003, 14:53:40 Uhr
Genial, Genial, wie lange hast dafür gebraucht?