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

04.10.2009, 13:08

Verwenden von Shadern mit ModelConverter

Hallo zusammen

Ich bin jetzt seit längerer Zeit (halbes Jahr) dabei ein Autorennen mit der Tribase Engine zu Programmieren. Es ist im prinzip auch schon lauffertig, es muss nur noch die landschaft gestaltet werden. Nun wollte ich aber mal etwas über die Shaderprogrammierung lernen. Also habe ich mir eine kopie meines Projektes angelegt.

Mein Auto besteht aus 5 materialien. Für mein experiment habe ich die der Karroserie genommen. Ursprünglicher 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
25
26
27
28
29
30
31
// Dieser Effekt wurde automatisch vom TriBase-Tool ModelConverter generiert.
// Hinweis: um einen Tabulator einzufügen, drücken Sie <Strg+Tab>!

DWORD   NumTextures         = 1;
STRING  Texture1Filename    = "REVTEX.BMP";
DWORD   Texture1Type        = 1; // 1: 2D-Textur; 2: Würfel; 3: Volumen
DWORD   Texture1ColorKey    = 0x00000000;
TEXTURE Texture1;

TECHNIQUE T1
{
    PASS P1
    {
        Texture[0]          = <Texture1>;

        // Es scheint keine Opazitätstextur zu geben!
        // Wenn Sie doch eine benutzen, ändern Sie "SelectArg2" in "Modulate" um!
        AlphaOp[0]          = SelectArg2;
        AlphaArg1[0]        = Texture;
        AlphaArg2[0]        = Current;

        // Materialeinstellungen
        MaterialDiffuse     = {0.498f, 0.498f, 0.498f, 1.000f};
        MaterialAmbient     = {0.498f, 0.498f, 0.498f, 0.000f};
        MaterialEmissive    = {0.000f, 0.000f, 0.000f, 0.000f};
        MaterialSpecular    = {0.360f, 0.360f, 0.360f, 0.000f};
        MaterialPower       = 63.000f;

        SpecularEnable      = True;
    }
}


Der ist halt automatisch vom Konverter erstellt.

Mein neuer Code ist:

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
float4x4 WorldViewProj;


DWORD   NumTextures         = 1;
STRING  Texture1Filename    = "REVTEX.BMP";
DWORD   Texture1Type        = 1; // 1: 2D-Textur; 2: Würfel; 3: Volumen
DWORD   Texture1ColorKey    = 0x00000000;
TEXTURE Texture1;

struct SVSO
{
    float4 Position : POSITION;
    float2 Texture: TEXCOORD0;
    float4 Diffuse : COLOR0;
};



sampler mySampler = sampler_state {
    Texture = <Texture1>;
    MinFilter = Linear;
    MagFilter = Linear;
    MIPFilter = Linear;
    AddressU = Wrap;
    AddressV = Wrap;
};




SVSO mainVS(float4 pos : POSITION,
            float3 normal : NORMAL,
            float4 diffuse : COLOR0){

    
    SVSO Output = (SVSO)(0);
    
    float Lighting = max(0.0f, dot(normal, float3(0.0f,1.0f,0.0f)));
    Output.Diffuse = float4(0.2f,0.0f,0.0f,1.0f)+(float4(1.0f,0.0f,0.0f,1.0f)*Lighting);

    
    Output.Position = mul(float4(pos),WorldViewProj);
    
    
    return Output;
}

float4 mainPS(SVSO Output) : COLOR
{

    
    

    Output.Diffuse = tex2D(mySampler, Output.Texture)*Output.Diffuse;
    
    
    
    return Output.Diffuse;
}
    





technique technique0 {
    pass p0 {

        VertexShader = compile vs_3_0 mainVS();
        PixelShader = compile ps_3_0 mainPS();
        
    }
}


Den Shadercode habe ich mit den NV FX Composer 2.5 erstellt.

Das problem ist nur, wie ich die Projektionsmatrix meiner Anwendung in den Shader bekomme. Versucht habe ich folgendes:

C-/C++-Quelltext

1
2
model->GetEffects()->pEffect->GetEffect()->SetMatrix("WorldViewProj",(D3DXMATRIX*)(&mCamera));
model->Render();


mit dem ergebniss das das gesamte Auto nicht angezeigt wird. Ich bekomme aber auch keine fehlermeldung.

Was mache ich falsch?

Nick
Aller Anfang ist schwer

2

04.10.2009, 13:52

WorldViewProj = World * View * Projection

Wobei

World = Worldmatrix des Autos (T, R, S)
View = Viewmatrix
Proj = Projectionsmatrix
fka tm

3

04.10.2009, 14:21

Also ich habe das jetzt mal so gemacht:

C-/C++-Quelltext

1
2
3
tbMatrix mWorldViewProj = mWorld2*mCamera*mProjection;
    model->GetEffects()->pEffect->GetEffect()->SetMatrix("WorldViewProj",(D3DXMATRIX*)(&mWorldViewProj));
    model->Render();


jetzt werden zwar die anderen Materialien dargestellt, die karroserie bleibt aber immer noch verborgen.

edit: hier ein foto

http://www.sounddesign.com/nick/upload/ohnekarroserie.jpg

Und so ohne shader:

http://www.sounddesign.com/nick/upload/Lambo.jpg
Aller Anfang ist schwer

4

04.10.2009, 14:39

Vielleicht liegts am CullMode...
fka tm

5

04.10.2009, 16:01

nee am cullmode liegts nicht

Ich probiers mal damit das ich die Textur weglasse und nur eine farbe rendere

edit: ok das funktioniert auch nicht, ich vermute mal das entweder die Matrix nicht übergeben wird oder falsch ist.
Aller Anfang ist schwer

6

05.10.2009, 16:53

Na.. dann werde ich das mir den Shadern erstmal lassen
Ich hatte gehofft das ich mal normal-mapping in mein Spiel
einbauen könnte, aber das lasse ich dann erstmal und baue weiter meine Landschaft.

trotzdem Danke für den versuch mir zu helfen

Nick
Aller Anfang ist schwer

Werbeanzeige