Licht D3D - EDIT: Beleuchtungsstärke
-
Hi!
Ich bin gerade dabei Licht in mein Spiel einzubauen - allerdings gibts da einige Probleme...Prinzipiell sehen die Einstellungen für Licht und Material so aus:
void CScene::init_light(void) { if(lighud){ if(lighter<=-3000) lighud=false; else lighter-=200; } else{ if(lighter>=6000) lighud=true; else lighter+=200; } D3DLIGHT9 light; // create the light struct ZeroMemory(&light, sizeof(light)); // clear out the light struct for use light.Type = D3DLIGHT_POINT; // make the light type point light' light.Diffuse.r = 1.0f; // .5 red light.Diffuse.g = 1.0f; // .5 green light.Diffuse.b = 1.0f; // .5 blue light.Diffuse.a = 1.0f; // full alpha (we'll get to that soon) light.Range = 2000.0f; // a range of 100 light.Attenuation0 = 0.125f; // no constant inverse attenuation light.Attenuation1 = 0.0f; // only .125 inverse attenuation light.Attenuation2 = 0.0f; // no square inverse attenuation D3DVECTOR vecPosition = {lighter, 100, lighter}; // the position of the light light.Position = vecPosition; // set the position m_lpD3DDevice->SetLight(0, &light); // send the light struct properties to light #0 m_lpD3DDevice->LightEnable(0, TRUE); // turn on light #0 D3DMATERIAL9 material; // create the material struct ZeroMemory(&material, sizeof(D3DMATERIAL9)); // clear out the struct for use material.Diffuse.r = material.Ambient.r = 1.0f; // set the material to full red material.Diffuse.g = material.Ambient.g = 1.0f; // set the material to full green material.Diffuse.b = material.Ambient.b = 1.0f; // set the material to full blue material.Diffuse.a = material.Ambient.a = 1.0f; // set the material to full alpha material.Power=500; m_lpD3DDevice->SetMaterial(&material); // set the globably-used material to &material return; }Dadurch bewegt sich das Licht und das ist auch nicht das Problem...
Das wirklich problematische ist die Tatsache dass die Texturen seltsame Farben annehmen und gar nicht mehr aussehen wie sie eigentlich sollten.
nach dem das mit den normalen Texturen nicht funktioniert hat -sieht übrigens so aus: (Beachtet dass die Lichtquelle sich in x und z gleichermaßen bewegt und dass das auf den bildern nichts mit dem Problem zu tun hat)
http://i191.photobucket.com/albums/z231/kuldren/lichttest2.jpg
, hab ich einfach mal ein Bild im Paint gemalt (einfach nur mit orange gefüllt) und dann sieht das ganze so aus:
http://i191.photobucket.com/albums/z231/kuldren/lichttest1.jpgD.h. er verwendet doch IRGENDWIE die Textur und verändert sie dann....

UND so SOLLTE es aussehen (hier ist das Licht deaktiviert):
http://i191.photobucket.com/albums/z231/kuldren/lichttest3.jpg
Ich wollte das Licht vorallem einbauen um einen metallischen Glanz zu erzeugen und der ganzen Szene mehr dynamik zu verleihen...
Die Vertices werden so bestimmt:
for(int all=0;all<numOfPlanes-10;all++){ if(drawPlanes[all]){ if(all%2==0 ){ cbuf[i] =initVertex( Planes[all]->x+ sizeOfEachPlane/2, Planes[all]->y, Planes[all]->z+ sizeOfEachPlane/2, 0,1,0, D3DCOLOR_XRGB(255,0,0), 1, 0); cbuf[i+1]=initVertex( Planes[all]->x+ sizeOfEachPlane/2, Planes[all]->y, Planes[all]->z- sizeOfEachPlane/2, 0,1,0,D3DCOLOR_XRGB(255,0,0), 1, 1); cbuf[i+2]=initVertex( Planes[all]->x- sizeOfEachPlane/2, Planes[all]->y, Planes[all]->z- sizeOfEachPlane/2, 0,1,0,D3DCOLOR_XRGB(255,0,0), 0, 1); } else{ cbuf[i] =initVertex( Planes[all]->x- sizeOfEachPlane/2, Planes[all]->y, Planes[all]->z- sizeOfEachPlane/2, 0,1,0,D3DCOLOR_XRGB(255,0,0), 0, 1); cbuf[i+1]=initVertex( Planes[all]->x- sizeOfEachPlane/2, Planes[all]->y, Planes[all]->z+ sizeOfEachPlane/2, 0,1,0,D3DCOLOR_XRGB(255,0,0), 0, 0); cbuf[i+2]=initVertex( Planes[all]->x+ sizeOfEachPlane/2, Planes[all]->y, Planes[all]->z+ sizeOfEachPlane/2, 0,1,0,D3DCOLOR_XRGB(255,0,0), 1, 0); } } // mit Leergut füllen else{ cbuf[i] =initVertex( 0,0,0, 0,1,0,D3DCOLOR_XRGB(255,0,0), 1, 0); cbuf[i+1]=initVertex( 0,0,0, 0,1,0,D3DCOLOR_XRGB(255,0,0), 1, 0); cbuf[i+2]=initVertex( 0,0,0, 0,1,0,D3DCOLOR_XRGB(255,0,0), 1, 0); } counter++; i+=3; all2++; }Also zeigen die VertexNormalen einfach direkt nach oben. Man sieht ja auch dass "etwas" funktioniert...
VertexFormat sieht so aus:
#define D3D_CUSTOMVERTEX2 (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) #define D3D_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) struct CUSTOMVERTEX{ public: FLOAT x,y,z; DWORD color; FLOAT tu,tv; }; struct CUSTOMVERTEX2 {FLOAT x,y,z; D3DVECTOR NORMAL; DWORD color;FLOAT u,v;};Habe 2 verschiedene - wollte nur mal das Spielfeld beleuchten und den Rest normal darstellen (funktionierte auch - naja bis auf das Spielfeld halt)
Direkt bevor ich die vertices für das Spielfeld bestimmte setze ich übrigens das hier ein:
Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);Dadurch sieht man dann den Lichtpunkt auf der Ebene.Ansonsten sieht man außen das seltsame Muster und innen nur eine schwarze Fläche.
Ich hoffe ihr könnt mir helfen, denn das Problem hab ich schon öfter lösen wollen es aber nie hinbekommen
-
was stimmt an dem lichttest1 nicht? sieht doch ok aus, orange textur mit einer lichtquelle drueber.
-
rapso schrieb:
was stimmt an dem lichttest1 nicht? sieht doch ok aus, orange textur mit einer lichtquelle drueber.
Ja...die gesamte Textur ist Orange...aber ich wollte damit nur zeigen dass er sehr wohl die Farben aus der Textur verwendet aber eben nur einen Teil davon....
wenn man den Rand um die orange Textur betrachtet sieht man dass sie anders aussieht als sie sollte...(vgl Lichttest3)Sonst würde das erste Bild ja dem letzten entsprechen wenn die Texturen korrekt dargestellt werden würden!!
Anscheinend werden die Texturen verwischt bzw. mit irgendetwas anderem gemischt oder sonst wie verändert....
lichttest2 sollte ja aussehen wie lichttest3 - nur eben nur zum teil beleuchtet...Wenn ich die Textur aus dem "Original" verwende dann ist die Fläche wie auf dem Bild ganz oben fast komplett schwarz...
Wenn ich eine hellere Version der Textur verwende, ist die Fläche grau...uswEDIT: Ok...durch testen hab ich herausgefunden dass er von der Textur nur die ganz linke Pixelspalte verwendet und dann auf die Texturgröße aufzerrt.
Allerdings sind die Texturkoordinaten ja zwischen 0 und 1 gesetzt....
hat einer eine Idee wieso das so ist?
-
Kuldren schrieb:
#define D3D_CUSTOMVERTEX2 (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) struct CUSTOMVERTEX2 {FLOAT x,y,z; D3DVECTOR NORMAL; DWORD color;FLOAT u,v;};Aehm, jo... f'`8k
AutocogitoGruß, TGGC (Der neue Game Star)
-
TGGC schrieb:
Kuldren schrieb:
#define D3D_CUSTOMVERTEX2 (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) struct CUSTOMVERTEX2 {FLOAT x,y,z; D3DVECTOR NORMAL; DWORD color;FLOAT u,v;};Aehm, jo... f'`8k
AutocogitoGruß, TGGC (Der neue Game Star)
Danke nochmal!
Hab das mit der Normalenberechnung nun auch hinbekommen.
Allerdings will das mit der Stärke der Beleuchtung nicht so ganz hinhauen...
a)
Momentan habe ich diese Einstellungen:Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true); Device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1); Device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE); Device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE); Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE); Device->SetRenderState(D3DRS_COLORVERTEX, FALSE);Da Modulate Standard bei der COLOROP ist, nehme ich an dass es oft verwendet wird, allerdings ist der Lichtkegel bzw Punkt auf der Oberfläche extrem schwach im Vergleich zu der "D3DTOP_ADD"-Einstellung.
Nur das Problem bei "ADD" ist dass das Licht eben zu der Texturfarbe hinzuaddiert wird. Was bedeutet, dass selbst wenn kein Licht vorhanden ist, alles der Texturfarbe und somit auch Helligkeit entspricht. Dafür wird bei ADD der Spot des Lichts total weiß (wie gewollt) dargestellt - der Rest aber auch hell....
Bei MODULATE hingegen ist ohne Licht alles dunkel, dafür ist selbst die stärkste Lichteinstellung:light.Diffuse.r = 1.0f; light.Diffuse.g = 1.0f; light.Diffuse.b = 1.0f; light.Diffuse.a = 1.0f;so schwach dass es gerade Mal der Helligket der Textur entspricht.
Meine Frage ist: Was muss ich ändern damit prinzipiell alles dunkel ist aber bei aktiviertem (stärksten) Licht der Spot komplett weiß ist?
Mein Ziel ist es dass ich generell alles "normal" belichte (also der Texturhelligkeit entsprechend) aber eben auch Lichter einbauen kann die das ganze überbelichten. Sei es ein "Energieball" o. Ä.
Das wäre mit MODULATE zwar möglich aber mich würde schon interessieren wie man das prinzipiell realisieren kann.b)
Das seltsame ist...bei den oben (States) genannten Einstellungen werden sogar Objekte denen ich noch gar keine Vertexnormalen zugewiesen habe - aber ein Material, belichtet und nicht einfach ignoriert....Werden da automatisch Vertexnormalen berechnet?!?!Da muss es doch Standardeinstellungen geben oder? Habe schon einiges ausprobiert aber komme immer auf das gleiche Ergebnis (entweder ADD oder MODULATE)
Jemand eine Idee?
-
a) D3DTOP_MODULATE2X , damit hast du bei 0.5 0.5 0.5 die helligkeit der textur, 1. wird entsprechend doppelt so hell (notfalls D3DTOP_MODULATE4X probieren).
b) afaik wird 0|0|1 (oder war es 0|1|0?) genommen. aber darauf sollte man sich nicht verlassen ;), lieber die richtigen werte uebergeben!
-
rapso schrieb:
a) D3DTOP_MODULATE2X , damit hast du bei 0.5 0.5 0.5 die helligkeit der textur, 1. wird entsprechend doppelt so hell (notfalls D3DTOP_MODULATE4X probieren).
Danke....aber die Helligkeit verwischt die Texturen eher als dass sie überbelichtet werden...

Ich werde jetzt ADD verwenden (in dem Projekt sollte es ohnehin nie dunkel sien) und mich damit beschäftigen wenn ich mal etwas programmiere wo ich absolute Dunkelheit braucherapso schrieb:
b) afaik wird 0|0|1 (oder war es 0|1|0?) genommen. aber darauf sollte man sich nicht verlassen ;), lieber die richtigen werte uebergeben!
Ah ok ...sowas dachte ich mir schon...ich nehme an dass es standardmäßig auf 0|1|0 gesetzt wird.
THX
-
Bei diffusem Licht ist das doch auch korrekt, das es nicht heller wird. Aber gibt ja auch so Sachen wie Specular. f'`8k
AutocogitoGruß, TGGC (Der neue Game Star)
-
TGGC schrieb:
Bei diffusem Licht ist das doch auch korrekt, das es nicht heller wird. Aber gibt ja auch so Sachen wie Specular. f'`8k
AutocogitoGruß, TGGC (Der neue Game Star)
nach den Diffuse-Zuweisungen folgt noch eine Specular=Diffuse Zuweisung...
Hab ich nur nicht reinkopiert
-
-
Kuldren schrieb:
TGGC schrieb:
Bei diffusem Licht ist das doch auch korrekt, das es nicht heller wird. Aber gibt ja auch so Sachen wie Specular. f'`8k
AutocogitoGruß, TGGC (Der neue Game Star)
nach den Diffuse-Zuweisungen folgt noch eine Specular=Diffuse Zuweisung...
Hab ich nur nicht reinkopiertmach ne weitere stage mit D3DTA_SPECULAR und D3DTA_CURRENT die du aufaddierst. wenn ich gleich gewust haette dass du nur nen specular willst

-
rapso schrieb:
Kuldren schrieb:
TGGC schrieb:
Bei diffusem Licht ist das doch auch korrekt, das es nicht heller wird. Aber gibt ja auch so Sachen wie Specular. f'`8k
AutocogitoGruß, TGGC (Der neue Game Star)
nach den Diffuse-Zuweisungen folgt noch eine Specular=Diffuse Zuweisung...
Hab ich nur nicht reinkopiertmach ne weitere stage mit D3DTA_SPECULAR und D3DTA_CURRENT die du aufaddierst. wenn ich gleich gewust haette dass du nur nen specular willst

Also so in der Art?
Device->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); Device->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE); Device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); Device->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_CURRENT); Device->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_SPECULAR); Device->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_ADD); Device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE); Device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE); Device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE); Device->SetRenderState(D3DRS_COLORVERTEX, FALSE);
Sorry..bei den Stages kenn ich mich leider kaum aus...Besonders nicht was die Kombinationen betrifft
Wie muss ich dann beim DrawCall die Stages auswählen?
-
*push*