| Autor |
Beitrag |
Florian H
      
Beiträge: 52
Win XP
D6 Pro
|
Verfasst: Mi 30.07.03 20:49
Hallo,
ich habe ein Problem mit directX8 (nicht DelphiX o.Ä., ganz normales DX 8.1 ab).
Und zwar habe ich einfach mal nach dem Tutorial von SelfDXD gearbeitet und bin damit auch ganz gut vorangekommen (habe vorher schon ein anderes Tutorial durchgemacht, bin aber ebenfalls am Licht gescheitert; außerdem hab ich mich vorher mit OpenGL beschäftigt), bis ich dann zum Licht kam...
Da gibts jetzt so komische Probleme:
 das Licht lässt sich farblich nicht richtig verändern
 das Licht ändert seine Farbe, je nachdem ob
- der Cursor im Fenster ist
- der Cursor außerhalb des Fensters ist
- die linke Maustaste geklickt ist
Komisch, oder?
Und jetzt hab ich gerade Screenshots von dem ganzen machen wollen,ändere noch was (was ich davor schon viele male getan habe) und was ist?
Das Licht ist weiß, und die Farbe lässt sich gar nicht mehr ändern....
Jetzt drängt sich mit natürlich je denn mehr die Frage auf, ob irgendwas mit meinem DX nicht stimmt...
Andere User konnten das leider noch nicht testen da bei allen das Device nicht initialisiert werden konnte
Ich habe übrigens DirectX9 installiert!
Ich hoffe mir kann endlich einer Helfen...
Viele Grüße
DK
Hier die Renderroutine, es könnte ja was drinne sein  (Das Objekt was da gezeichnet wird ist eine Kugel aus einer .X-Datei mit Textur):
-------------------------------------------------
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:
| procedure TForm1.Render; var i, j: integer; WorldMatrix, TempMatrix: TD3DMatrix; myLight: TD3DLIGHT8; myMaterial : TD3DMaterial8; begin Inc(Frames);
d3dDev8.Clear(0, nil, D3DClear_Target or D3DClear_ZBuffer, D3DCOLOR_XRGB(0, 0, 0), 2, 0);
d3dDev8.BeginScene;
myLight._Type := D3DLIGHT_POINT;
myLight.Diffuse.r := 1; myLight.Diffuse.g := 0; myLight.Diffuse.b := 1;
myLight.Specular.r := 0; myLight.Specular.g := 0; myLight.Specular.b := 1;
myLight.Position.x := 0; myLight.Position.y := 0; myLight.Position.z := 0.5;
myLight.Range := 0.7; myLight.Falloff := 0; d3dDev8.SetLight(1,myLight); d3dDev8.LightEnable(1,True) ;
myMAterial.Emissive.r := 0.0; myMAterial.Emissive.g := 0.0; myMAterial.Emissive.b := 0.0; d3dDev8.SetMaterial(myMAterial);
D3DXMatrixScaling(WorldMatrix, 0.01, 0.01, 0.01); D3DXMatrixRotationYawPitchRoll(TempMatrix, frames / 1800,frames / 450,frames / 1000); D3DXMatrixMultiply(WorldMatrix, WorldMatrix, TempMatrix); D3DDev8.SetTransform(D3DTS_WORLD, WorldMatrix);
for j := 0 to length(objects) - 1 do begin d3dDev8.SetTexture(0, objects[i].texture); if Objects[j].Draw then begin for i := 0 to objects[j].materialNumber do begin objects[j].mesh.DrawSubset(i); end; end; end;
d3dDev8.EndScene;
d3dDev8.Present(nil, nil, 0, nil); end; |
Moderiert von UGrohne: Code- durch Delphi-Tags ersetzt
|
|
Marlno
      
Beiträge: 75
|
Verfasst: Sa 02.08.03 01:39
also eigentlich ja so (siehe unten)
aber im vergleich zu deinem kan ich kaum zusammenhänge erkennen
schau doch mal......
| Zitat: | Einstellen der Lichteigenschaften
In DirectXGraphics können Sie mehrere Lichtquellen einstellen. Die genaue Anzahl ist von ihrer Grafikkarte abhängig und lässt sich über die D3DCAPS8 ermitteln. Das Einstellen des Lichtes erfolgt mit folgender Funktion des Direct3DDevices:
function SetLight(const Index : LongWord;
var pLight : TD3DLight8) : HResult;
Index: Jeder Lichtquelle, die Sie definieren, weisen Sie eine Indexzahl zu. Möchten Sie ein bestimmtes Licht ändern oder herausnehmen, können Sie dieses über den Index ansprechen.
pLight: Ein Record des Typs D3DLIGHT8, in dem alle notwendigen Farben und Parameter definiert sind.
Zu jeder Set-Funktion gibt es das entsprechende Gegenstück, die Get-Funktion:
function GetLight(const Index : LongWord;
out pLight : TD3DLight8) : HResult;
GetLight liefert für den angegebenen Index ein Record des Typs D3DLIGHT8 mit den entsprechenden Eigenschaften zurück.
Als kleines Beispiel will ich Ihnen eine Prozedur zeigen, die uns das Eingeben der Parameter für ein Spotlight erleichtert.
procedure SetSpotLight( _dr, _dg, _db,
_ar, _ag, _ab,
_sr, _sg, _sb,
_at0, _at1, _at2: Single;
_pos, _Dir: TD3DXVector3;
_theta, _phi, _falloff,
_range: single;
_index: cardinal);
var
light : TD3DLIGHT8;
begin
ZeroMemory( @light, Sizeof( TD3DLIGHT8 ) );
with light do
begin
_Type := D3DLIGHT_SPOT;
Diffuse.r := _dr;
Diffuse.g := _dg;
Diffuse.b := _db;
Ambient.r := _ar;
Ambient.g := _ag;
Ambient.b := _ab;
Specular.r := _sr;
Specular.g := _sg;
Specular.b := _sb;
attenuation0 := _at0;
attenuation1 := _at1;
attenuation2 := _at2;
position := _pos;
direction := _dir;
theta := _theta;
phi := _phi;
falloff := _falloff;
range := _range;
end;
d3ddev8.SetLight( _index, light );
end;
Einmal eingebunden in Ihrer Anwendung ist das Definieren von Spotlights sehr einfach, weil Sie lediglich eine Prozedur mit allen Parametern aufrufen, die nötig sind. Das spart Zeit und Platz. Der Übung halber habe ich die Prozeduren für ein Point Light und ein Directional Light weggelassen. Aber mit dieser Hilfe dürfte das für Sie jetzt kein Problem sein.
Ambientes Licht setzen Sie mit einem RenderState des Direct3DDevices:
d3ddev8.setrenderstate( D3DRS_AMBIENT, $006B6B6B );
Hierbei geben Sie das ambiente Licht als 32-Bit-Wert an. Schwarz ist dabei gleichbedeutend mit keinem ambienten Licht.
|
viel glück
|
|
Florian H 
      
Beiträge: 52
Win XP
D6 Pro
|
Verfasst: Sa 02.08.03 09:42
Hallo,
ja, diesen Teil kenne ich aus dem SelfDXD-turorial, er hilft mir leider nicht weiter, da er ja das selbe macht wie ich auch, nur eben in eine Prozedur verpackt...
Wenn ich es mit so einer Prozedur aus dem SelfDXD probiere, passiert nix anderes!
danke dir trotzdem für deine Hilfe (ist bei so einem Thema ja selten) 
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Sa 02.08.03 10:25
warum fragst du Marty (der author) nicht direkt in seinem forum?
_________________ mfg.
mâximôv
|
|
Florian H 
      
Beiträge: 52
Win XP
D6 Pro
|
Verfasst: Sa 02.08.03 10:36
Hm, hab ich noch gar nicht gewusst dass da eines ist...
Aber ich glaube eher dass das an meinem System oder so liegt, denn wieso sonst bekommt jeder einen Engine-Fehler ausser ich ?
Aber ich frag ihn mal
|
|
Florian H 
      
Beiträge: 52
Win XP
D6 Pro
|
Verfasst: Sa 02.08.03 11:18
Hm, wenn ich das Projekt aus der Delphi-IDE raus starte, hat es eine Textur, wenn ich die EXE im Explorer starte, nicht!
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Sa 02.08.03 11:55
In den letzten Tagen ist Marty mit seinem Forum wech von meinem Webspace gezogen von daher kann es vieleicht die eine oder andere Stöhung gegeben haben. Ansonsten für DirectX-Fragen bietet sich sehr [url] www.neobrothers.de[/url] an, ist auch eines von Marty-Stammforen.
@textur: Schreit förmlich nach einem Pfad-Fehler. Lege mal ne Ordner á la "gfx" an kopiere die Texturen dort rein und lade sie im Programm mit ".\gfx\something". Befindet sich die EXE dann darunter sollte er es ohne Probleme laden. Alternativ verwende den paramstr(0) um die Position der Exe zu ermitteln.
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
Florian H 
      
Beiträge: 52
Win XP
D6 Pro
|
Verfasst: Sa 02.08.03 12:18
habe ich (ExtractFilePAth(PAramStr(0))+'Media\texturname.bmp')!
Und wenn ich die Textur lösche, kommt in beiden Fällen eine Fehlermeldung, denn ich frage im Programm ab, ob alles funktioniert hat....daran liegts also nicht!
|
|
Marlno
      
Beiträge: 75
|
Verfasst: Sa 02.08.03 14:03
hmm schon ok wenn meins nicht geholfen hat...
vielleicht mal DX neuinstallieren
oder welche version hast du?
ansonsten siehts so aus als ob du irgend nen fehler im system hast...
Marlno
|
|
Florian H 
      
Beiträge: 52
Win XP
D6 Pro
|
Verfasst: Sa 02.08.03 14:08
Hab DirectX9b (oder was das aktuelle ist) drauf, spiele laufen einwandfrei!
gibts irgendwo noch die alten DLLs und Units für 8.1 (nicht 8.1ab)!?
|
|
Marlno
      
Beiträge: 75
|
Verfasst: Sa 02.08.03 14:20
hatte 9b nicht auf manchen system zusammenstellungen bugs???
ja spielen laufen komischer weise immer..... naja sind .......
welche alten dlls ??? units???
du meinst das alte sdk?? ja sicher lich weiß zwar nicht wo aber im netz mal schauen dann findet man was.....
zudem ist es nicht immer erforderlich das sdk
gut bei delphi glaub ich schon *lol*
such mal bei google... hätte ich ja für dich machen können muss aber jetzt weg....
sorry
MFG
Marlno
|
|
Marlno
      
Beiträge: 75
|
Verfasst: Sa 02.08.03 14:35
muss jetzt bye
aber schau mal hier hier sind alle sdk (links auf download klicken)
dx 8 ist ganz unten und in der mitte sind zusätze extras für dx 9 textur zusatz und und und
schau mal rauf
msdn.microsoft.com/directx/
bye
MFG
Marlno
|
|
|