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

1

28.06.2005, 21:08

Vertex-Shader funktioniert nicht

Hallo,
Ich habe mir vor kurzem das Kapitel für Vertex- und Pixel-Shader angesehen. Dann wollte ich den Glow-Effekt in meinem Spiel umsetzen. Aber ich hab nichts davon auf dem Bildschirm gesehen.
Vielleicht findet hier jemand einen Fehler:

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
float4x4 WorldView;
float4x4 Projection;

float4 GlowColor=float4(0.0f,0.0f,1.0f,1.0f);
float GlowThickness=1.0f;

struct VSOutput
{
    float4 Position:POSITION;
    float4 Diffuse:COLOR0;
};

VSOutput VSProc(float4 Position:POSITION,float3 Normal:NORMAL)
{
    VSOutput Out=(VSOutput)(0);
    float3 N = normalize(mul(Normal, (float3x3)WorldView));     // normal (view space)
        float3 P = mul(Position, WorldView) + GlowThickness * N;    // displaced position (view space)
        float3 A = float3(0, 0, 1);                                 // glow axis

        float Power;

        Power  = dot(N, A);
        Power *= Power;
        Power -= 1;
        Power *= Power;     // Power = (1 - (N.A)^2)^2 [ = ((N.A)^2 - 1)^2 ]
    
        float4 GlowAmbient=float4(0.0f,0.0f,1.0f,1.0f);

    Out.Position = mul(float4(P, 1), Projection);   // projected position
        Out.Diffuse  = GlowColor * Power + GlowAmbient; // modulated glow color + glow ambient
    
        return Out;    
}

TECHNIQUE T1
{
    PASS P1
    {
        MaterialDiffuse     = {1.0f,0.0f,0.0f,1.0f};
        MaterialAmbient     = {1.0f,0.0f,0.0f,0.0f};
        MaterialEmissive    = {1.0f,0.0f,0.0f,0.0f};
        MaterialSpecular    = {1.0f,0.0f,1.0f,0.0f};
        MaterialPower       = 30.0f;

        SpecularEnable      = true;

        LightType[0]        = Point;
        LightAmbient[0]     = {0.0f,0.0f,0.0f,1.0f};
        //LightDiffuse[0]       = {1.0f,1.0f,1.0f,1.0f};
        LightSpecular[0]    = {1.0f,0.0f,0.0f,1.0f};
        LightPosition[0]    = {0.0f,20.0f,0.0f};
        LightRange[0]       = 100.0f;
        LightAttenuation0[0]    = 0.0f;
        LightAttenuation1[0]    = 0.01f;
        LightAttenuation2[0]    = 0.0f;
        LightEnable[0]      = true;
    }
    PASS P2
    {
        VertexShader=compile vs_1_1 VSProc();
        PixelShader=NULL;// no texture
            Texture[0] = NULL;

            // enable alpha blending
            AlphaBlendEnable = TRUE;
            SrcBlend         = ONE;
            DestBlend        = ONE;

            // set up texture stage states to use the diffuse color
            ColorOp[0]   = SELECTARG2;
            ColorArg2[0] = DIFFUSE;
            AlphaOp[0]   = SELECTARG2;
            AlphaArg2[0] = DIFFUSE;

            ColorOp[1]   = DISABLE;
            AlphaOp[1]   = DISABLE;

        
        MaterialDiffuse     = {1.0f,0.0f,0.0f,1.0f};
        MaterialAmbient     = {1.0f,0.0f,0.0f,0.0f};
        MaterialEmissive    = {1.0f,0.0f,0.0f,0.0f};
        MaterialSpecular    = {1.0f,0.0f,1.0f,0.0f};
        MaterialPower       = 30.0f;

        SpecularEnable      = true;

        LightType[0]        = Point;
        LightAmbient[0]     = {0.0f,0.0f,0.0f,1.0f};
        //LightDiffuse[0]       = {1.0f,1.0f,1.0f,1.0f};
        LightSpecular[0]    = {1.0f,0.0f,0.0f,1.0f};
        LightPosition[0]    = {0.0f,20.0f,0.0f};
        LightRange[0]       = 100.0f;
        LightAttenuation0[0]    = 0.0f;
        LightAttenuation1[0]    = 0.01f;
        LightAttenuation2[0]    = 0.0f;
        LightEnable[0]      = true;
    }
}


In Pass P2 habe ich es auch mit der einzigen Anweisung "VertexShader=compile vs_1_1 VSProc();

aber wenn ich in meinem Spiel mit Pass P2 render, sehe ich nichts davon, bei P1 schon.
Mein Projekt: Rise of the Sylvan

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

28.06.2005, 21:42

codetags,bitte

3

29.06.2005, 11:43

Die Initialisierung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
m_pCrystalEffect=NULL;
    if (FAILED(D3DXCreateEffectFromFile(g_pD3DDevice,"Data\\Effect.fx",
                                    NULL,NULL,0,NULL,&m_pEffect,NULL)))
    {
        return E_FAIL;
    }
    hTechnique=m_pCrystalEffect->GetTechnique(0);;
    if (FAILED(m_pCrystalEffect->ValidateTechnique(hTechnique))) return E_FAIL;
    m_pCrystalEffect->SetTechnique(hTechnique);


Und das Rendern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
D3DXMATRIX mMul;
            D3DXMatrixMultiply(&mMul,&mWorld,&mView);
            m_pEffect->SetMatrix("WorldView",&mMul);
            m_pEffect->SetMatrix("Projection",&mProj);
            UINT uiPasses;
            m_pEffect->Begin(&uiPasses,0);
            m_pEffect->BeginPass(1);
                
            m_pModel->DrawSubset(0);
            
            m_pEffect->EndPass();
            m_pEffect->End();
Mein Projekt: Rise of the Sylvan

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

4

29.06.2005, 12:51

Das meinte er nicht, mach mal bitte in deinem Eröffnungsthread codetags drum ;) lässt sich besser lesen und Fehler finden ;)

5

29.06.2005, 14:01

Hast du die Vertexdeclaration def. u. gesetzt?

mfg Markus

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

29.06.2005, 21:50

ja

Quellcode

1
2
3
4
5
struct VSOutput
{
float4 Position:POSITION;
float4 Diffuse:COLOR0;
};


ist übrigends zu großen Teil aus dem DX SDK wenn ich mich nicht irre

EDIT: <-- Codetags ;)

7

30.06.2005, 11:58

OK, ich hab die Code-Tags gesetzt.
Warum funktioniert dieser Shader nicht? Vielleicht muss man etwas bei D3DXCreateEffectFromFile ändern?
Mein Projekt: Rise of the Sylvan

Werbeanzeige