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

05.10.2008, 21:50

Volumenschatten - Wird falsch dargestellt

Hallo :)

ich versuche grade echtzeit - volumenschatten hinzubekommen
mit einem verfahren aus dem dx-sdk:

dabei wird einmal ein schattenmesh aus einen normalen mesh erstellt
(wo die ecken durch quads ersetzt werden)

danach wird mithilfe eines vertexshaders das ganze in die länge gezogen
und mit dem stencilbuffer kombiniert hat man schatten.

bei mir nicht... :cry:

die funktion die den mesh umwandelt hab ich aus dem sdk kopiert,
daran kann es nicht liegen. es muss an meinem effekt liegen.

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
59
60
61
62
63
64
65
66
float4x4 WorldMatrix;
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)
    {
        Position += LightDir * 100.f;
    }
    Position = mul(Position, WorldMatrix);
    return mul(Position, ProjMatrix);
}
        
TECHNIQUE T1
{
    PASS P1
    {
      AlphaBlendEnable = true;
      SrcBlend = Zero;
      DestBlend = One;
      ZFunc = Less;
      ZWriteEnable = false;
      StencilRef = 1;
      StencilMask = 0xFFFFFFFF;
      StencilWriteMask = 0xFFFFFFFF;
      StencilFunc = Always;
      StencilZFail = Decr;
      StencilPass = Keep;
      CullMode = CCW;
      VertexShader = compile vs_1_1 vs_main();
    }
    PASS P2
    {
        CullMode = CW;
        StencilZFail = Incr;
        VertexShader = compile vs_1_1 vs_main();
    }
}
TECHNIQUE T2
{
    PASS P0
    {
        CullMode = Ccw;
        AlphaBlendEnable = true;
        SrcBlend = SrcAlpha;
        DestBlend = InvSrcAlpha;
        ZWriteEnable = false;
        ZFunc = Less;
        StencilEnable = true;
        StencilRef = 1;
        StencilMask = 0xFFFFFFFF;
        StencilWriteMask = 0xFFFFFFFF;
        StencilFunc = Always;
        StencilZFail = Decr;
        StencilPass = Keep;
    }
    PASS P1
    {
        CullMode = Cw;
        StencilZFail = Incr;
    }
}


der code zum rendern:

C-/C++-Quelltext

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
effect->SetTechnique("T1");
effect->SetMatrix("WorldMatrix", &(world * view));
effect->SetMatrix("ProjMatrix", &proj);
effect->SetVector("LightDir", &D3DXVECTOR4(1.f, -1.f, 1.f, 0.f));
effect->Begin(&numpasses, 0);
// alle pässe rendern

for (unsigned i = 0; i < numpasses; ++i)
{
    effect->BeginPass(i);
    shadowmesh->DrawSubset(0); // mit dem gestreckten schatten-mesh

    effect->EndPass();
}
effect->End();
        
struct shadowvertex
{
    float x, y, z;
    float rhw;
    DWORD color;
};
float maxx = static_cast<float>(GetSystemMetrics(SM_CXSCREEN));
float maxy = static_cast<float>(GetSystemMetrics(SM_CYSCREEN));

const DWORD shadowcolor = 0xff000000;

shadowvertex shadow[] = {
    {0.f, 0.f, 0.f, 1.f, shadowcolor},
    {0.f, maxy, 0.f, 1.f, shadowcolor},
    {maxx, 0.f, 0.f, 1.f, shadowcolor},
    {maxx, maxy, 0.f, 1.f, shadowcolor}
};
// ein rechteck über dem bildschirm als schatten


effect->SetTechnique("T2");
effect->Begin(&numpasses, 0);
for (unsigned i = 0; i < numpasses; ++i)
{
    effect->BeginPass(i);
    dev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, shadow, sizeof(shadow[0]));
    effect->EndPass();
}
effect->End();

mesh->DrawSubset(0);


kompiliert fehlerfrei
(szene ist ein würfel auf einer ebene)

allerdings sehe ich nur ein schattenrechteck was auf der XY-ebene liegt
und beim würfel anfängt. kein richtiger schatten

hab den effekt auch von dem sdk, sollte doch eigentlich funktionieren

die matrizen und die lichtquelle stimmen alle
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

06.10.2008, 08:07

Ganz trivial:
Hast du den Stencilbuffer richtig initialisiert? (Format getestet usw. ?)
Vergleich das mal mit dem SDK Beispiel.

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

06.10.2008, 10:56

format ist D24S8

ich seh ja was, nur siehts nicht richtig aus.
der fehler muss also in dem effekt liegen. einige stellen kommen mir in dem
beispiel auch komisch vor, aber es läuft ja...
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

06.10.2008, 11:06

Evtl transformierst du die Normalen nicht korrekt? Ein Screenshot wäre möglicherweise auch hilfreich...
@D13_Dreinig

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

06.10.2008, 12:20


(Link)


Links ist CW culling, rechts ist CCW.
mal testweise mit grünem schatten.

das volumen wird korrekt gezeichnet, und die stellen wo der stencilbuffer
== 1 ist, werden auch richtig schattiert.

nur klappt die stencil-geschichte nicht, der fehler muss dort liegen:

(neuer code)

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
PASS P1
{
        AlphaBlendEnable = true;
        SrcBlend = Zero;
        DestBlend = One;
        ZFunc = Always;
        ZWriteEnable = false;
        StencilEnable = true;
        StencilRef = 1;
        StencilMask = 0xFFFFFFFF;
        StencilWriteMask = 0xFFFFFFFF;
        StencilFunc = Always;
        StencilZFail = Keep;
        StencilPass = Incr;
        CullMode = CCW;
        VertexShader = compile vs_1_1 vs_main();
}
PASS P2
{
        CullMode = CW;
        StencilZFail = Keep;
        StencilPass = Decr;
        VertexShader = compile vs_1_1 vs_main();
}
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

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

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

6

06.10.2008, 23:24

ich hab jetzt mal das beispiel aus dem buch kopiert.. immernoch kein schatten :( hat den keiner eine idee woran es liegen könnte ?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

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

7

07.10.2008, 08:36

Gehts denn mit dem Mesh aus dem SDK?

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

8

07.10.2008, 10:16

soweit kam ich garnicht mehr, jedesmal kommt die meldung


(Link)


wie kriege ich das den wieder weg ?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

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

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

9

07.10.2008, 10:19

ok im release gehts noch

=> immer noch kein schatten...
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

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

10

07.10.2008, 10:29

Zitat von »"Gotbread"«

ich hab jetzt mal das beispiel aus dem buch kopiert.. immernoch kein schatten :( hat den keiner eine idee woran es liegen könnte ?

Möglicherweise an der Vertex-Deklaration deines Meshes...

Werbeanzeige