Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

15.12.2008, 17:22

Volumenschatten - Artefaktbildung

Hallo

habe endlich den volumenschatten hinbekommen.
Allerdings werden nicht die silouetten extrudiert, sondern alle
CW-Faces.

der effekt funktioniert zum teil, den der Schatten ist so wie er soll
nur das schattenwerfende objekt hat hässliche artefakte


(Link)


effektcode:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
float4x4 WorldMatrix;
float4x4 ViewMatrix;
float4x4 ProjMatrix;
float4 LightDir;
float4 vs_main(float4 Position : POSITION, float3 Normal : NORMAL) : POSITION
{
    float3 Norm = mul(Normal, (float3x3)WorldMatrix);
    float4 Pos = mul(Position, WorldMatrix);
    if (dot(-LightDir, Norm) < 0.f)
    {
        Pos += LightDir * 1000000.f;
    }
    Pos = mul(Pos, ViewMatrix);
    return mul(Pos, ProjMatrix);
}
TECHNIQUE T1
{
    PASS P0
    {
        ZEnable = true;
        ZWriteEnable = false;
        ZFunc = Less;
        ColorWriteEnable = 0;
        Lighting = False;
        ShadeMode = Flat;
        FogEnable = False;
        StencilEnable = true;
        StencilFunc = Always;
        StencilZFail = Decr;
        StencilPass = Keep;
        CullMode = CCW;
        VertexShader = compile vs_1_1 vs_main();
    }
    PASS P1
    {
        CullMode = CW;
        StencilZFail = Incr;
    }
}
TECHNIQUE T2
{
    PASS P0
    {
        AlphaBlendEnable = true;
        BlendOp = Add;
        SrcBlend = SrcAlpha;
        DestBlend = InvSrcAlpha;
        ZEnable = true;
        ZFunc = Always;
        StencilEnable = true;
        StencilFunc = NotEqual;
        StencilRef = 0;
        StencilZFail = Keep;
        StencilFail = Keep;
        StencilPass = Keep;
        CullMode = None;
    }
}


T1 wird zum rendern des schattenvolumes genutzt
T2 für den schatten der einfach ein graues rechteck über den ganzen
bildschirm ist.

kann das am zbuffer liegen?

hab schon alles ausprobiert, im beispiel klappt das uach ohne schattenbildung
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

15.12.2008, 18:10

Vermutlich liegts daran das du alle Front-Faces extruierst und nicht nur die Siluetten.
@D13_Dreinig

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

15.12.2008, 18:25

Laut beispielcode werden nur die rückseiten extrudiert


(Link)


die vorderseiten müssten sich doch eigentlich "rauskürzen"

an den siluetten zu extrudieren lässt sich mit shadern nicht machen
oder?

trotzdem funktioniert es in der demo....
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

15.12.2008, 18:55

Stimmt, wenn du die Frontfaces verwirfst... Aber sicher das du damit das komplette Volumen bekommst? Was is z.B. mit dem Fall (gamedev.: klick)?

Achja, die Siluette lässt sich natürlich im Shader extruieren. Eine bekannte Methode ist z.B. die W-Komponente der Vertexkoordinate auf 0 zu setzen, für die backcap Vertices.
@D13_Dreinig

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

15.12.2008, 20:14

Jo ich nutze das DepthFail verfahren da geht das.

Mit dem Silluetten extrudieren mein ich das das Volumen

Silluette - Volumen - Backcap enthällt

dabei müsste aber die frontcap zur silluette verschoben werden was
ich mir nicht als rechenfreundlich vorstelle falls es geht

hab behelfsmäßig das schattenvolumen ein bissel (0.2f) gegen lichtrichtung
verschoben. das ist zwar geschummelt, aber bei normal großen
objekten fällt es kaum auf.

ich bin bisher so vorgegangen:

szene in den backbuffer + framebuffer rendern

extrudiertes volumen in den stencil rendern

Da tritt das Problem auf, da die beiden volumina sich überlagern,
was bei der kleinsten kammeraänderung zu den artefakten führt.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

15.12.2008, 21:09

Zitat von »"Gotbread"«


dabei müsste aber die frontcap zur silluette verschoben werden was
ich mir nicht als rechenfreundlich vorstelle falls es geht


Wieso? Du hast deine Edgeliste einfach doppelt, der Rest passiert automatisch.

Zitat von »"Gotbread"«


Da tritt das Problem auf, da die beiden volumina sich überlagern,
was bei der kleinsten kammeraänderung zu den artefakten führt.


Da hilft ggf auch vorsichtiges "offsetten" des Depthwertes.
@D13_Dreinig

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

15.12.2008, 21:30

Zitat von »"David_pb"«

Wieso? Du hast deine Edgeliste einfach doppelt, der Rest passiert automatisch.


nein das mein ich nicht :D

bei einem normalen volumenschatten von z.b. einem würfel

Quellcode

1
2
3
4
   ___                  ______________
 /__ /|                /              |
|   | |     =>        |               |
|__.|/                |______________/


ist die (das?) ganze frontcap drin

man müsste aber die frontcap abschneiden um den effekt zu erzielen,
dann würde da aber ein loch entstehen

mit dem offsetten meinst du kleine werte addieren?

warum klappt das den bei den demos? in dx-sdk ist auch ein beispiel drin
was ohne tricks auskommt.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

15.12.2008, 22:06

Zitat von »"Gotbread"«


mit dem offsetten meinst du kleine werte addieren?


Im Prinzip ja. GL bietet dafür ja z.B. glPolygonOffset an.
@D13_Dreinig

Werbeanzeige