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

t512

Frischling

  • »t512« ist der Autor dieses Themas
  • Private Nachricht senden

1

25.07.2009, 11:40

Spotlight zeigt keine Wirkung in Übungsprogramm

Hallo. Nach längerer Pause habe ich mir jetzt fest vorgenommen das Buch doch noch durchzuarbeiten, doch leider scheint es schon bei der einfachsten Aufgabe ein Problem zu geben. Ich wollte nur mal ein Spotlight testen. Dafür habe ich das Beleuchtungs-Beispielprogramm aus Kapitel 2 leicht geändert.

C-/C++-Quelltext

1
2
3
4
5
6
PointLight.Type = D3DLIGHT_SPOT;
PointLight.Ambient = tbColor(0.0f, 0.0f, 0.0f); // damit wirklich nur    //objekte im lichtkegel sichtbar sind

PointLight.Phi = 30.0f;
PointLight.Theta = 60.0f;
PointLight.Falloff = 1.0f;
PointLight.Direction = tbVector3(1.0f, 0.0f, 0.0f);


Jetzt sollten nur ein paar Kugeln rechts angeleuchtet werden. Wenn ich die Exe ausführe scheint sich aber immer noch das alte Punktlicht in der Szene zu befinden. Generell werden änderungen übernommen. Wenn ich das Licht deaktiviere bleibt die Szene dunkel.

Eine weitere Frage noch: Müssen die ganzen Lichteinstellungen nach g_pD3DDevice->BeginScene(); kommen? Was muss genau zwischen BeginScene und EndScene kommen? Doch nur Renderfunktionen wie g_pD3DDevice->DrawPrimitiveUP, oder?

2

25.07.2009, 12:15

- PointLight-Struktur initialisiert (ZeroMemory, memset...)?
- Farben (Diffuse etc.) angegeben?
- Die Werte von Phi und Theta würde ich vertauschen
- Spotlights haben eine Position

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
D3DLIGHT9 PointLight;
ZeroMemory( &PointLight, sizeof(D3DLIGHT9) );
PointLight.Type = D3DLIGHT_SPOT;

PointLight.Diffuse.r = 1.0f;
PointLight.Diffuse.g = 1.0f;
PointLight.Diffuse.b = 1.0f;
PointLight.Diffuse.a = 1.0f;

PointLight.Position = tbVector3(0.0f, 5.0f, -10.0f); 
PointLight.Direction = tbVector3(1.0f, -0.5f, 0.0f); 
   
PointLight.Range = 1.0f;
PointLight.Theta = 0.5f;
PointLight.Phi = 1.0f;
PointLight.Falloff = 1.0f;
PointLight.Attenuation0 = 1.0f;

g_pD3DDevice->SetLight( 0, &PointLight );
g_pD3DDevice->LightEnable( 0, TRUE );


Das Setup für das Licht würde ich aus Performance-Gründen auslagern.
Zum Beispiel in eine Init-Funktion respektive vor deiner Render-Funktion.
fka tm

t512

Frischling

  • »t512« ist der Autor dieses Themas
  • Private Nachricht senden

3

25.07.2009, 13:33

Danke. Die Zeilen, die ich gepostet habe, waren diejenigen, die ich verändert oder hinzugefügt habe, also nicht der vollständige Code.
Der Fehler lag wirklich bei Phi und Theta. Die Automatische Codevervollständigung zeigt bei der Auswahl von Phi folgenden Text an: "Inner angle of spotlight cone" was ich irrtümlicherweise als "Angle of inner cone" Interpretiert habe.

Werbeanzeige