2 registered members (NnamueN, 1 invisible),
1,489
guests, and 6
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Texturteilabschnitte "leuchten" lassen.
#331535
07/04/10 21:38
07/04/10 21:38
|
Joined: Nov 2005
Posts: 112
miez
OP
Member
|
OP
Member
Joined: Nov 2005
Posts: 112
|
Ich habe eine Frage bezüglich eines sehr alten Effekts, den ich in Quake 1 gesehen habe. Ich habe folgende Textur erstellt: Ich möchte nun der Textur "sagen", dass die roten Linien immer die maximale Helligkeit anzeigen, unabhängig von der Dunkelheit des Levels, selbst bei völliger Dunkelheit, sogesehen dass diese Bereiche nicht von der Shadowmap abgedunkelt werden. Zu 90% vermute ich schon als Antwort Shader, nur kann ich keine Schreiben (Bin ja grad mal an Lite-C dran). Nur, Q1 hatte noch keine Shader, wie man sie heute kennt. Wie wurde das damals gemacht? Und mit dem GS ist es auf jeden Fall möglich, denn ich habe heute eine interessante A6-Demo gesehen, ein Kirmes-Gefährt ähnlich dem Breakdancer und dort war genau der Effekt zu sehen, bei den animierten Glühbirnen am Mittelpodest und den Hecks der Fahrgondeln. Durch die Demo bin ich überhaupt erst wieder darauf aufmerksam geworden. Leider war es eine WRS Datei, sonst hätte ich es durch den Code herausbekommen...
Last edited by miez; 07/04/10 21:39.
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: miez]
#331540
07/04/10 22:23
07/04/10 22:23
|
Joined: May 2005
Posts: 2,713 Lübeck
Slin
Expert
|
Expert
Joined: May 2005
Posts: 2,713
Lübeck
|
Shader! Du könntest in 2 passes rendern, einmal mit und einmal ohne Shading und zweiteres anhand der Alphamap der Textur, bei der dann die hellen Bereiche voll sichbar sein sollten, blenden. Warscheinlich geht es noch irgendwie elegeanter in einem Pass, aber in diesen eher altmodischen Tricks stecke ich nicht so sehr drinn .
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: miez]
#331545
07/04/10 23:27
07/04/10 23:27
|
Joined: Apr 2010
Posts: 172
wdlmaster
Member
|
Member
Joined: Apr 2010
Posts: 172
|
...Zu 90% vermute ich schon als Antwort Shader... Korrekt!
float4x4 matWorldViewProj;
texture entSkin1;
texture entSkin2;
sampler SKIN = sampler_state { texture = <entSkin1>;};
sampler LIGHT = sampler_state { texture = <entSkin2>;};
float4 VS ( in float4 P : position,
in float2 T1 : texcoord0,
in float2 T2 : texcoord1,
out float4 tex : texcoord0) : position {
tex.xy = T1;
tex.zw = T2;
return mul(P,matWorldViewProj);}
float4 PS ( in float4 tex : texcoord0) : color {
float4 color = tex2D(SKIN,tex.xy);
color = lerp (color,color*tex2D(LIGHT,tex.zw),color.a);
return color;}
technique t{ pass p{
zWriteEnable = 1;
AlphaBlendEnable = 0;
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_2_0 PS(); }}
Du brauchst ledeglich im Alphakanal deiner Textur anzugeben, was NICHT beleuchtet werden soll --> je schwärzer desto leuchtender...
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: Damocles_]
#331570
07/05/10 06:49
07/05/10 06:49
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
@WDLMaster: das Problem an deinem Shader ist aber, dass das Standard-Gamestudio Lightning damit, so wie ich es sehe, komplett außer Kraft gesetzt wird... dann kannste das auch gleich so in die Textur einbacken und UNLIT setzen ;-)
Ich würde ein seperates Rendertarget aufmachen und darein über einen Pixelshader den Alphakanal maskieren welcher Pixel leuchten soll und zwar über den Alphakanal der Textur, der angibt, wo was leuchten soll. Der Vorteil ist, dass das Mipmapping dann auch schon korrekt die Alpha-Daten interpoliert, sodass du niemals "zu scharfe" Leuchtränder hast auch wenn du bereits mipmaps verwendest. Dann setzt du den RGB Wert des Pixels mit dem direkten Farbwert aus der Textur. Anschließend kannst du dann in einem Postprocessing-Shader dann das Kamerabild und das Leuchtbild kombinieren, indem du den Farbpixel des Kamerabildes um den maskierten Alphawert in Richtung der Leuchtfarbe mittels lerp interpolierst.
Der Vorteil des Verfahrens ist, dass es "over the top" laufen würde, das heißt, du kannst es einfach über dem normalen Gamestudio-Lightning laufen lassen. Zusätzlich könntest du auch das Leuchtbild blurren, sodass ein echter "Glüh" Effekt auftritt.
Last edited by HeelX; 07/05/10 06:57.
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: HeelX]
#331597
07/05/10 10:35
07/05/10 10:35
|
Joined: Apr 2010
Posts: 172
wdlmaster
Member
|
Member
Joined: Apr 2010
Posts: 172
|
das Problem an deinem Shader ist aber, dass das Standard-Gamestudio Lightning damit, so wie ich es sehe, komplett außer Kraft gesetzt wird... ja, das hab ich im Nachhinein auch gemerkt. Aber ich kann ja als Ausrede immer noch behaupten, dass es 1:30 morgens war... dann kannste das auch gleich so in die Textur einbacken und UNLIT setzen ;-) Das stimmt nicht ganz, denn es wird ja immerhin die Lightmap berücksichtigt
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: wdlmaster]
#331603
07/05/10 11:39
07/05/10 11:39
|
Joined: Nov 2005
Posts: 112
miez
OP
Member
|
OP
Member
Joined: Nov 2005
Posts: 112
|
@HeeliX: Es heißt nicht jemand in deiner Verwandschaft zufällig "Carmack" oder...? Ich find es immer wieder erstaunlich, was einige hier draufhaben. Also der erste Code in einem Shader gepackt funktioniert! WdlMaster, hast du das mal eben aus dem Ärmel programmiert? Ich wäre ja schon froh, wenn ich sowas um 12 Uhr Mittags Hinkriegen würde, aber die Shadersyntax ist mir zu abstrakt. Freude Götterfunken! Seit A5 hab ich darauf gewartet und hatte damals diese Frage gestellt (Ewig her, 5 Jahre vielleicht...) und damals konnte niemand etwas dazu sagen, bzw. hatte zwei "Keine Ahnung"-Replies. Aber es stimmt... Es funktioniert nur mit statischem Licht. Wenn ich mit dynamischen Licht runrenne, bleiben die dunklen\schwarzen Flächen wie sie sind. Was mache ich eigentlich mit dem zweiten geposteten Codesnippet? Der sieht für einen Shader irgendwie nicht komplett aus. Ich hab den Code mal als FX ausprobiert, aber im Level waren alle Wände mit 255 Helligkeit erleuchtet. Muss ich den Code im vorangegangenen Shader an einer Stelle einfügen?
Last edited by miez; 07/05/10 12:31.
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: miez]
#331605
07/05/10 12:16
07/05/10 12:16
|
Joined: May 2005
Posts: 2,713 Lübeck
Slin
Expert
|
Expert
Joined: May 2005
Posts: 2,713
Lübeck
|
Naja, es handelt sich um die von dir gewünschte Shaderlose Lösung die zumindest auf Hardware von 2000 noch funktionieren müsste . Sie sollte auch mit der Beleuchtung zurecht kommen. Verwendet wird es wie ein Shader, es handelt sich aber um einen Fixed Function Effekt. Wie es aussieht habe ich aber irgendetwas falsch gemacht . Die HLSL, CG oder auch GLSL Syntax ist mir deutlich geläufiger als dieser doch ziemlich altmodische Kram. Es soll eigentlich die Umsetzung von dem sein, was ich in meinem ersten Post geschrieben habe. Dabei entspricht es auch in etwa dem von Christian beschriebenen, nur etwas performanter und altmodischer, was dabei auch verzicht auf einen Blur bedeutet. Was man mit simplem Bloom aber vielleicht nachholen könnte .
|
|
|
Re: Texturteilabschnitte "leuchten" lassen.
[Re: miez]
#331607
07/05/10 12:30
07/05/10 12:30
|
Joined: Apr 2010
Posts: 172
wdlmaster
Member
|
Member
Joined: Apr 2010
Posts: 172
|
ich hab hier noch die performance-lastige Variante (braucht Shader Model 3, es sei denn, du brauchst nur Vertex lighting, dann tuts auch 2)
#define sat saturate
#define dst distance
#define vlc vecLightColor
#define vlp vecLightPos
float4x4 matWorldViewProj;
float4x4 matWorld;
float4 vecLightColor[8];
float4 vecLightPos[8];
int iLights;
texture entSkin1;
texture entSkin2;
sampler SKIN = sampler_state { texture = <entSkin1>;};
sampler LIGHT = sampler_state { texture = <entSkin2>;};
float4 VS ( in float4 P : position,
in float2 T1 : texcoord0,
in float2 T2 : texcoord1,
out float4 tex : texcoord0,
out float3 pos : texcoord1) : position {
tex.xy = T1;
tex.zw = T2;
pos = mul(P,matWorld).xyz;
return mul(P,matWorldViewProj);}
float4 PS ( in float4 tex : texcoord0,
in float3 pos : texcoord1) : color {
float4 color = tex2D(SKIN,tex.xy);
float4 L = 0;
for (int i=0; i<iLights; i++) L += vlc[i] * sat((vlp[i].w - dst(vlp[i].xyz,pos)) / vlp[i].w);
color = lerp (color,color * (tex2D(LIGHT,tex.zw) + L),color.a);
return color;}
technique t{ pass p{
zWriteEnable = 1;
AlphaBlendEnable = 0;
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_3_0 PS(); }}
aber wahrscheinlich is der FFP Effekt für so ein Oldschool Projekt angemessener
|
|
|
|