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

Dezibell

Frischling

  • »Dezibell« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Kleve nrw

  • Private Nachricht senden

1

11.06.2006, 21:43

simple shader beginner prob

hallo alle zusammen!

ich bin gerade erst auf die shader programmierung gekommen und steig da noch nicht so ganz durch. aus dem dx9 sdk hab ich mir ein beispiel geschnappt und versucht es in mein projekt einzubinden, doch der bildschirm bleibt schwarz. der shader soll jedenfalls ein quadrat in einer bestimmten farbe darstellen.
da ich nicht weiß was genau ich fragen soll, gibt es jetzt erstmal den kompletten quellcode :)

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#define WINDOW_CLASS_NAME "Game Shell Window"

#include <windows.h>  
#include <d3dx9.h>

void Game_Shutdown(void);
void Game_Init(void);
void Game_Main(void);

D3DCAPS9                     caps;
LPDIRECT3D9                  g_pd3d             = NULL;
IDirect3DDevice9*            g_pd3dDevice         = NULL;
IDirect3DVertexBuffer9*      g_pVB                = NULL;   
LPDIRECT3DVERTEXSHADERR9     g_pVertexShader      = NULL;
LPDIRECT3DVERTEXDECLARATION9 g_pVertexDeclaration = NULL;
    
D3DXMATRIXA16 matWorld;
D3DXMATRIXA16 matProj;
D3DXMATRIXA16 matView;

HWND main_window_handle = NULL; 
    
struct CUSTOMVERTEX
{
    FLOAT x, y, z;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

///////////////////////////////////////////////////////////////////////////////

void Game_Init(void)
{
    // *********** IDIRECT3D **************

    // DIRECT3D9 SCHNITTSTELLE ERZEUGEN!
    g_pd3d = Direct3DCreate9(D3D_SDK_VERSION);
    
    if(g_pd3d == NULL)
        MessageBox(NULL, "DX9 konnte nicht initialiesiert werden !!",
                   "Fehler!", MB_OK | MB_ICONEXCLAMATION);

    // *********** PRESENT PARAMS **************

    // MINIMALE D3DPRESENT_PARAMETERS EINTRAGEN
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;


    // *********** D3DDEVICE **************

    // D3D9DEVICE SCHNITTSTELLE ERZEUGEN
    if( FAILED( g_pd3d->CreateDevice(D3DADAPTER_DEFAULT, 
                                     D3DDEVTYPE_HAL, 
                                     main_window_handle,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &d3dpp, 
                                     &g_pd3dDevice ) ) )
    MessageBox(NULL, "D3DDEVICE KONNTE NICHT ERSTELLT WERDEN",
               "FEHLER", MB_OK | MB_ICONEXCLAMATION);

    // ************* VB **************

    // VERTEXBUFFER ERZEUGEN
    if(FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                  0,    /* Usage */ 
                                                  D3DFVF_CUSTOMVERTEX, 
                                                  D3DPOOL_DEFAULT, 
                                                  &g_pVB,
                                                  NULL)))
    MessageBox(NULL, "VERTEXBUFFER KONNTE NICHT ERSTELLT WERDEN",
               "FEHLER", MB_OK | MB_ICONEXCLAMATION);

    // VERTICES EINTRAGEN
    CUSTOMVERTEX vertices[] =
    {
        { -1.0f, 1.0f, 0.0f },
        { -1.0f,-1.0f, 0.0f },
        {  1.0f, 1.0f, 0.0f },
        {  1.0f,-1.0f, 0.0f },
    };
    
    // ALLE VERTICES AUF EINEN SCHLAG ÜBERTRAGEN
    VOID* pVertices;
    g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );      
    memcpy( pVertices, vertices, sizeof(vertices) );
    g_pVB->Unlock();

    // *********** MATRIX **************

    // KAMERA EINSTELLEN, VIEWMATRIX ERSTELLEN UND EINSETZTEN
    D3DXVECTOR3 vEyePt   ( 0.0f, 0.0f,-5.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec   ( 0.0f, 1.0f, 0.0f );
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    // PROJEKTIONSMATRIX ERSTELLEN UND EINSETZEN
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

    // WICHTIGSTE RENDER STATES SETZEN
    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE);
    g_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE);
    g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );


    g_pd3dDevice->GetDeviceCaps(&caps);
    if( caps.VertexShaderVersion < D3DVS_VERSION(1,1) )
        MessageBox(NULL, "´KEINE SHADER!!!",
               "FEHLER", MB_OK | MB_ICONEXCLAMATION);


    // Create the shader declaration.
    D3DVERTEXELEMENT9 decl[] = 
    {
      { 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
      D3DDECL_END()
    };

    if( FAILED( g_pd3dDevice->CreateVertexDeclaration( decl, &g_pVertexDeclaration ) ) )
    MessageBox(NULL, "FEHLER BEI VERTEX SHADER DECLARATION",
               "FEHLER", MB_OK | MB_ICONEXCLAMATION);


    LPD3DXBUFFER pCode;
    
    D3DXAssembleShaderFromFile( "VertexShader.vsh", NULL, NULL, 0,  
                                &pCode, NULL);   
    
    g_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(),
                                      &g_pVertexShader);
    pCode->Release();
} 

///////////////////////////////////////////////////////////////////////////////

void Game_Main(void)
{
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
    g_pd3dDevice->BeginScene();

    D3DXMatrixIdentity(&matWorld);
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    
    D3DXMatrixMultiply( &matWorld, &matView, &matProj );
    D3DXMatrixTranspose( &matWorld, &matWorld );
    
    g_pd3dDevice->SetVertexShaderConstantF( 0, (float*)&matWorld, 4 );

    float color[4] = {0,1.0,0,0};
    g_pd3dDevice->SetVertexShaderConstantF( 4, (float*)&color, 1 );

    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetVertexShader( g_pVertexShader );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
    

    g_pd3dDevice->EndScene();   
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
} 

///////////////////////////////////////////////////////////////////////////////

void Game_Shutdown(void)
{
    if(g_pVertexShader != NULL)
        g_pVertexShader->Release();

    // D3DDEVICE9 SCHNITTSTELLE LÖSCHEN
    if(g_pd3dDevice != NULL)
        g_pd3dDevice->Release();
    
    // IDIRECT3D SCHNITTSTELLE LÖSCHEN
    if(g_pd3d != NULL)
        g_pd3d->Release();
} 



// ****************************************************************************

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    PAINTSTRUCT     ps;     
    HDC             hdc;    

    // Nachrichtenverarbeitung
    switch(msg)
    {       
        case WM_CREATE: 
        {
            return(0);
        } 
        break;
   
        case WM_PAINT: 
        {          
            hdc = BeginPaint(hwnd,&ps);            
            EndPaint(hwnd,&ps);          
            return(0);
        }
        break;

        case WM_DESTROY: 
        {          
            PostQuitMessage(0);          
            return(0);
        } 
        break;

        default:
        break;
    } 
    return (DefWindowProc(hwnd, msg, wparam, lparam));
} 

//-----------------------------------------------------------------------------

int WINAPI WinMain( HINSTANCE hinstance,
                    HINSTANCE hprevinstance,
                    LPSTR lpcmdline,
                    int ncmdshow)
{
    WNDCLASSEX winclass; 
    HWND       hwnd;     
    MSG        msg;      
  
    winclass.cbSize         = sizeof(WNDCLASSEX);
    winclass.style          = CS_HREDRAW | CS_VREDRAW ;   
    winclass.lpfnWndProc    = WindowProc;
    winclass.cbClsExtra     = 0;
    winclass.cbWndExtra     = 0;
    winclass.hInstance      = hinstance;
    winclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    winclass.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName   = NULL;
    winclass.lpszClassName  = WINDOW_CLASS_NAME;
    winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
   
    if (!RegisterClassEx(&winclass))
        return(0);

    if (!(hwnd = CreateWindowEx(NULL,                 
                                WINDOW_CLASS_NAME,     
                                "My Game Shell",
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE ,                                
                                0,0,      
                                800,600,  
                                NULL,     
                                NULL,     
                                hinstance,
                                NULL))) 
    return(0);
    
    main_window_handle = hwnd;

    //------------------------
    Game_Init();
    //------------------------
    
    // Nachrichtenweiterleitung
    while(TRUE)
    {
        
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        { 
            if (msg.message == WM_QUIT)
               break;
             
            TranslateMessage(&msg);        
            DispatchMessage(&msg);
        } 
        //------------------------      
        Game_Main();
        //------------------------
    } 
    //------------------------
    Game_Shutdown();
    //------------------------
    return(msg.wParam);
} 

und hier noch der shader code im file VertexShader.vsh

Quellcode

1
2
3
4
vs_1_1
dcl_position v0 
m4x4 oPos, v0, c0 
mov oD0, c4


hat jemand ne idee warum das nicht klappt? ich bekomme keine fehlermeldung, nur der bildschirm bleibt schwarz :(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

11.06.2006, 21:56

Wenn Du einen Vertex-Shader benutzt, musst du alle Transformationen selbst durchführen. Also Welt-, Kamera- und Projektionstransformation.
"SetTransform" hat bei einem Vertex-Shader keine Wirkung!

Dezibell

Frischling

  • »Dezibell« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Kleve nrw

  • Private Nachricht senden

3

11.06.2006, 22:54

danke david ! hoffentlich hilft mir das :) weiss zwar noch nicht wie das geht, aber ich werd mal sehen :)

Dezibell

Frischling

  • »Dezibell« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Kleve nrw

  • Private Nachricht senden

4

12.06.2006, 05:03

sooo! nach durchzechter nacht funktioniert nun das vertexshader demo umgebettet in meiner programmierumgebung! david hatte wohl recht :)

und jetzt kann ich endlich beruhigt schlafen gehen!

ps: wie siehts aus? soll ich den neuen code posten??? ist für dummköpfe wie mich geeignet*ggg

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

12.06.2006, 09:23

ja mich würd zb interessieren, da ich neulich mit einfachen VertexShadern angefangen hab.
Dafür Zeig ich auch meinen. Damit konnte ich ein Objekt pulsieren lassen.


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
// VertexOutput
struct SVertexShaderOutput
{
    float4 Position : POSITION;
    float4 Diffuse : COLOR0;
};

// Marizen
float4x4 MatTransViewProj : WorldViewProjection; 
float timeSin;

// Der Vertex-Shader
SVertexShaderOutput VertexShaderProc(float4 InPosition : POSITION,
                                     float4 InNormal : NORMAL)
{
    SVertexShaderOutput Output = (SVertexShaderOutput)(0);
    
    // Vertex entlang des NormalenVektors verschieben und projektzieren
    Output.Position = mul((InPosition + 0.4f * InNormal*timeSin), MatTransViewProj);

    Output.Diffuse = float4(1.0f, 1.0f, 1.0f, 0.5f);
    
    return Output;
}
                        
TECHNIQUE T1
{
    PASS P1
    {
        VertexShader = compile vs_1_1 VertexShaderProc();
    }
}   



Die Variable "TimeSin" ist bei mir der Betrag des Sinuses der Vergangenen Zeit. Also ich hab das so gemacht:

C-/C++-Quelltext

1
2
3
float timeSin = sinf(fNumSecsPassed*5);
if(timeSin < 0.0f) timeSin = -sinf(fNumSecsPassed*5);
g_pShaderEffect->GetEffect()->SetFloat("timeSin", timeSin);




:)

Dezibell

Frischling

  • »Dezibell« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Kleve nrw

  • Private Nachricht senden

6

12.06.2006, 19:16

so. hier nun das ganze neue programm :

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
// ***************************************************************************
// NICHT VERGESSEN ! 
// D3DX9.lib bzw D3D9.lib müssen zusätzlich verlinked sein !!
// ***************************************************************************

#define WINDOW_CLASS_NAME "Game Shell Window"

#include <windows.h>  
#include <d3dx9.h>

void Game_Shutdown(void);
void Game_Init(void);
void Game_Main(void);

PDIRECT3D9                      g_pd3d               = NULL;
IDirect3DDevice9*               g_pd3dDevice         = NULL;
IDirect3DVertexBuffer9*         g_pVB                = NULL;
LPDIRECT3DVERTEXSHADER9         g_pVertexShader      = NULL;
LPDIRECT3DVERTEXDECLARATION9    g_pVertexDeclaration = NULL;
D3DXMATRIXA16 mat;
D3DXMATRIXA16 matProj;
D3DXMATRIXA16 matView;
HWND main_window_handle = NULL;
    
struct CUSTOMVERTEX
{
    FLOAT x, y, z;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ)

int screenWidth  = 800;
int screenHeight = 600;

///////////////////////////////////////////////////////////////////////////////

void Game_Init(void)
{
    // *********** IDIRECT3D **************

    // DIRECT3D9 SCHNITTSTELLE ERZEUGEN!
    g_pd3d = Direct3DCreate9(D3D_SDK_VERSION);
    
    if(g_pd3d == NULL)
        MessageBox(NULL, "DX9 konnte nicht initialiesiert werden !!",
                   "Fehler!", MB_OK | MB_ICONEXCLAMATION);

    // MINIMALE D3DPRESENT_PARAMETERS EINTRAGEN
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    // D3D9DEVICE SCHNITTSTELLE ERZEUGEN
    if( FAILED( g_pd3d->CreateDevice(D3DADAPTER_DEFAULT, 
                                     D3DDEVTYPE_HAL, 
                                     main_window_handle,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &d3dpp, 
                                     &g_pd3dDevice ) ) )
    MessageBox(NULL, "D3DDEVICE KONNTE NICHT ERSTELLT WERDEN",
               "FEHLER", MB_OK | MB_ICONEXCLAMATION);



    // ************* VB **************

    // VERTEXBUFFER ERZEUGEN
    if(FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                  0,    /* Usage */ 
                                                  D3DFVF_CUSTOMVERTEX, 
                                                  D3DPOOL_DEFAULT, 
                                                  &g_pVB,
                                                  NULL)))
    MessageBox(NULL, "VERTEXBUFFER KONNTE NICHT ERSTELLT WERDEN",
               "FEHLER", MB_OK | MB_ICONEXCLAMATION);


    // VERTICES FESTLEGEN.
    CUSTOMVERTEX vertices[] =
    {
        { -1.0f, 1.0f, 0.0f },
        { -1.0f,-1.0f, 0.0f },
        {  1.0f, 1.0f, 0.0f },
        {  1.0f,-1.0f, 0.0f },

    };
    
    // ALLE VERTICES AUF EINEN SCHLAG IN DEN VB ÜBERTRAGEN
    VOID* pVertices;
    g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );      
    memcpy( pVertices, vertices, sizeof(vertices) );
    g_pVB->Unlock();

    
    
    // *********** MATRIX **************

    // Setup the view matrix
    D3DXVECTOR3 vEye = D3DXVECTOR3( 2.0f, 3.0f, 3.0f );
    D3DXVECTOR3 vAt  = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUp  = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
    D3DXMatrixLookAtRH( &matView, &vEye, &vAt, &vUp );


    // Set up the projection matrix
    FLOAT fAspectRatio = (FLOAT)screenWidth / (FLOAT)screenHeight;
    D3DXMatrixPerspectiveFovRH( &matProj, D3DXToRadian(60.0f), fAspectRatio, 0.1f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );



    // *********** VERTEXSHADER **************
    
    LPD3DXBUFFER pCode;

    // Setup vertex shader declaration
    D3DVERTEXELEMENT9 decl[] =
    {
        { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
        D3DDECL_END()
    };

    // Vertex shader declaration
    if( FAILED( g_pd3dDevice->CreateVertexDeclaration( decl, &g_pVertexDeclaration ) ) )
        MessageBox(NULL, "VERTEXDECLARATION KONNTE NICHT ERSTELLT WERDEN",
           "FEHLER", MB_OK | MB_ICONEXCLAMATION);

    
    DWORD dwFlags = 0;
    // Assemble the vertex shader from the file
    if( FAILED( D3DXAssembleShaderFromFile( "Ripple.vsh", 
                                             NULL, NULL, dwFlags, &pCode, NULL ) ) )
        MessageBox(NULL, "VERTEX SHADER ASSEMBLE FEHLER",
           "FEHLER", MB_OK | MB_ICONEXCLAMATION);


    // Create the vertex shader
    if(FAILED( g_pd3dDevice->CreateVertexShader( (DWORD*)pCode->GetBufferPointer(),
                                                  &g_pVertexShader )))
        MessageBox(NULL, "VERTEXSHADER KONNTE NICHT ERSTELLT WERDEN",
           "FEHLER", MB_OK | MB_ICONEXCLAMATION);

    if(pCode!=NULL)
        pCode->Release();

    // WICHTIGSTE RENDER STATES SETZEN
    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE);
    g_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE);
} 

///////////////////////////////////////////////////////////////////////////////

void Game_Main(void)
{
    // NEIN! ICH NEHME KEINE RÜCKSICHT AUF DIE ZEIT :)
    static float test = 0.0f;
    test+=0.01f;

    // Setup object matrix
    D3DXMatrixMultiply( &mat, &matView, &matProj );
    D3DXMatrixTranspose( &mat, &mat );

    D3DXVECTOR4 vA( sinf(test)*15.0f, 0.0f, 0.5f, 1.0f );
    D3DXVECTOR4 vD( D3DX_PI, 1.0f/(2.0f*D3DX_PI), 2.0f*D3DX_PI, 0.05f );

    // Taylor series coefficients for sin and cos
    D3DXVECTOR4 vSin( 1.0f, -1.0f/6.0f, 1.0f/120.0f, -1.0f/5040.0f );
    D3DXVECTOR4 vCos( 1.0f, -1.0f/2.0f, 1.0f/ 24.0f, -1.0f/ 720.0f );

    // Set up the vertex shader constants   
    g_pd3dDevice->SetVertexShaderConstantF(  0, (float*)&mat,  4 );
    g_pd3dDevice->SetVertexShaderConstantF(  4, (float*)&vA,   1 );
    g_pd3dDevice->SetVertexShaderConstantF(  7, (float*)&vD,   1 );
    g_pd3dDevice->SetVertexShaderConstantF( 10, (float*)&vSin, 1 );
    g_pd3dDevice->SetVertexShaderConstantF( 11, (float*)&vCos, 1 );
    
    
    // RENDERN !!!
    
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,0,0), 1.0f, 0 );

    g_pd3dDevice->BeginScene();

    g_pd3dDevice->SetVertexDeclaration( g_pVertexDeclaration );
    g_pd3dDevice->SetVertexShader( g_pVertexShader );
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

    g_pd3dDevice->EndScene();   

    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
} 

///////////////////////////////////////////////////////////////////////////////

void Game_Shutdown(void)
{
    // VERTEX SHADER DECLARATION LÖSCHEN
    if(g_pVertexDeclaration != NULL)
        g_pVertexDeclaration->Release();
    
    // VERTEXSHADER LÖSCHEN
    if(g_pVertexShader != NULL)
        g_pVertexShader->Release();

    // D3DDEVICE9 SCHNITTSTELLE LÖSCHEN
    if(g_pd3dDevice != NULL)
        g_pd3dDevice->Release();
    
    // IDIRECT3D SCHNITTSTELLE LÖSCHEN
    if(g_pd3d != NULL)
        g_pd3d->Release();
} 



// ****************************************************************************

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    PAINTSTRUCT     ps;     
    HDC             hdc;    

    // Nachrichtenverarbeitung
    switch(msg)
    {       
        case WM_CREATE: 
        {
            return(0);
        } 
        break;
   
        case WM_PAINT: 
        {          
            hdc = BeginPaint(hwnd,&ps);            
            EndPaint(hwnd,&ps);          
            return(0);
        }
        break;

        case WM_DESTROY: 
        {          
            PostQuitMessage(0);          
            return(0);
        } 
        break;

        default:
        break;
    } 
    return (DefWindowProc(hwnd, msg, wparam, lparam));
} 

//-----------------------------------------------------------------------------

int WINAPI WinMain( HINSTANCE hinstance,
                    HINSTANCE hprevinstance,
                    LPSTR lpcmdline,
                    int ncmdshow)
{
    WNDCLASSEX winclass; 
    HWND       hwnd;     
    MSG        msg;      
  
    winclass.cbSize         = sizeof(WNDCLASSEX);
    winclass.style          = CS_HREDRAW | CS_VREDRAW ;   
    winclass.lpfnWndProc    = WindowProc;
    winclass.cbClsExtra     = 0;
    winclass.cbWndExtra     = 0;
    winclass.hInstance      = hinstance;
    winclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    winclass.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName   = NULL;
    winclass.lpszClassName  = WINDOW_CLASS_NAME;
    winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
   
    if (!RegisterClassEx(&winclass))
        return(0);

    if (!(hwnd = CreateWindowEx(NULL,                 
                                WINDOW_CLASS_NAME,     
                                "My Game Shell",
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE ,                                
                                0,0,      
                                screenWidth,screenHeight,  
                                NULL,     
                                NULL,     
                                hinstance,
                                NULL))) 
    return(0);
    
    main_window_handle = hwnd;

    //------------------------
    Game_Init();
    //------------------------
    
    // Nachrichtenweiterleitung
    while(TRUE)
    {
        
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        { 
            if (msg.message == WM_QUIT)
               break;
             
            TranslateMessage(&msg);        
            DispatchMessage(&msg);
        } 
        //------------------------      
        Game_Main();
        //------------------------
    } 
    //------------------------
    Game_Shutdown();
    //------------------------
    return(msg.wParam);
}

jetzt noch des passende shader prog :

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
vs.1.1
; Constants:
;
;  c0-c3  - View+Projection matrix
;
;  c4.x   - time
;  c4.y   - 0
;  c4.z   - 0.5
;  c4.w   - 1.0
;
;  c7.x   - pi
;  c7.y   - 1/2pi
;  c7.z   - 2pi
;  c7.w   - 0.05
;
;  c10    - first 4 taylor coefficients for sin(x)
;  c11    - first 4 taylor coefficients for cos(x)

dcl_position v0

; Decompress position
mov r0.x, v0.x
mov r0.y, c4.w       ; 1
mov r0.z, v0.y
mov r0.w, c4.w       ; 1

; Compute theta from distance and time
mov r4.xz, r0        ; xz
mov r4.y, c4.y       ; y = 0
dp3 r4.x, r4, r4     ; d2
rsq r4.x, r4.x
rcp r4.x, r4.x       ; d
mul r4.xyz, r4, c4.x     ; scale by time

; Clamp theta to -pi..pi
add r4.x, r4.x, c7.x
mul r4.x, r4.x, c7.y
frc r4.xy, r4.x
mul r4.x, r4.x, c7.z
add r4.x, r4.x,-c7.x

; Compute first 4 values in sin and cos series
mov r5.x, c4.w       ; d^0
mov r4.x, r4.x       ; d^1
mul r5.y, r4.x, r4.x ; d^2
mul r4.y, r4.x, r5.y ; d^3
mul r5.z, r5.y, r5.y ; d^4
mul r4.z, r4.x, r5.z ; d^5
mul r5.w, r5.y, r5.z ; d^6
mul r4.w, r4.x, r5.w ; d^7

mul r4, r4, c10      ; sin
dp4 r4.x, r4, c4.w

mul r5, r5, c11      ; cos
dp4 r5.x, r5, c4.w

; Set color
add r5.x, -r5.x, c4.w ; + 1.0
mul oD0, r5.x, c4.z   ; * 0.5

; Scale height
mul r0.y, r4.x, c7.w

; Transform position
dp4 oPos.x, r0, c0
dp4 oPos.y, r0, c1
dp4 oPos.z, r0, c2
dp4 oPos.w, r0, c3


ich verstehe von dem shader-kram noch garnix*g. aber das programm hier erstellt wenigstens einen und rendert ihn auch.
der shader kommt in eine datei namens "Ripple.vsh" und muss im projektverzeichnis liegen. das ist der shader aus dem dx9 sdk. wer sehen will wie der shader an einem objekt mit mehr vertizes aussieht, sollte sich das SDK beispiel "VertexShader" mal anschauen.

mit dem hier geposteten prog kann ich nun ersteinmal anfangen zu lernen wie das mit den shadern so funktioniert! wichtig war erstmal ein
funktionierender reduzierter code. Vielleicht hilft das ja auch den anderen totalen anfängern wie mir :) einfach copy/paste und verlinken, funzt!
erklären kann ich euch den shader nicht :) versteh ihn ja selbst noch nicht :)

PS an Wümpftlbrümpftl :
hast du denn noch irgendwelche links zu tutorials mit denen du vielleicht angefangen hast zum thema shader? ist ja nicht so leicht sich darüber zu informieren. meine, die meisten setzten zu viel voraus :)

Dezi sagt tschüss!

Dezibell

Frischling

  • »Dezibell« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Kleve nrw

  • Private Nachricht senden

7

12.06.2006, 20:28

*grummel.. grummel!
wie immer gehts nicht ohne bug!
naja, n fehler ist es zwar icht, aber die zeile :

Quellcode

1
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

kann man ruhigen gewissens rauswerfen. die hat da nix zu suchen bzw hat sie keinen effekt!...

Werbeanzeige