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