D3DMATERIAL9 in FVF packn???
-
Ahoi leutz!!!

Hab mir ma die DX Dokumentation angeschaut, und bin momentan leicht verwirrt...
Warum kann ich im FVF nur DIFFUSE- und SPECULAR- materialfarben reinbringen, was ist denn mit AMBIENT und EMISSIVE sowie den verschiedenen glanzfaktoren??
mal angenommen, ich würd gerne einen glühenden kometen zeichnen, der überall total verschiedene farben hat, auf der sonnenzugewandten seite orange-rot glüht (auch wenn er grad von einem planetem verdeckt wird->hohe temperatur->emissive(0.8,0,0) ) und auf der anderen seite noch vereist ist und voll toll glänzt...
und was mach ich jetzt? für jeden vertex etwa ein extra array mit D3DMATERIAL9 anlegen oder wes?
und was würde es mir bringen? wie erkläre ich dem directX dass er zwischen den verschiedenglänzenden vertizes interpolieren soll?wäre dankbar, wenn ihr mir mal erzählen würdet, wie ich all diese werte in des FVF reinbringe..
omg, ich habs mir irgendwie einfacher vorgestellt...
-
hast du dich schon mit LPD3DXEFFECT beschäftigt? damit könntest du das ohne probleme lösen.

-
öhhm... nein, damit hab ich mich noch nicht beschäftigt, weis nicht ma was es sein soll
eigentlich wollte ich erstmal ein einfaches farbiges dreieck in einer beleuchteten szene rendern, und habe eigentlich gehofft, dass ich für eine derart billige aufgabe nicht mit irgendwelchen effekten jonglieren oder irgendwelche vertexshader erfinden müsste 
Ich verstehe das nicht: wenn man für jeden vertex irgendwelche daten für die beleuchtungsberechnungen braucht, würde es doch sinn machen, diese daten auch im vertex zu speichern, damit man in jedem vertex halt alles hat, was man auch braucht, nähmlich position, richtung und farbe... omfg...@dezibell: ookay, von mir aus, ich les mir dann mal halt was zu den effekten durch... thx schon ma fürn tipp....

@all: gehts wirklich nicht einfacher?

-
@ dezibell: jup, okay, scheint genau des zu sein, was ich brauche... danke sehr! kämpf mich grad durchs buch von davin scherfgen durch, wenns so weiter geht, bin ich mit dem buch fertig, ohne ein einziges dreieck gesehn zu haben

-
njo... alles schön und gut... aber mit diesen effekten kann ich wieder nur genau das tun, was ich auch manuell mit pD3DDevice->SetMaterial() machen würde... man kann da doch nach wie vor nicht für jeden einzelnen vertex einen ganz konkrete ambient-farbe setzen, oder hab ich wieder was überlesen?

also k, zum teufel mit dem blöden asteroiden...
ich will 'nen apfel.
Des ist im grunde einfach nur ein verschiedenfarbiger rot-gelb-grüner klumpen... die eine seite ist beleuchtet. für diffuseColor hat jeder vertex einen eigenen wert. für ambientColor jedoch nicht... (sowieso eine komische idee, diese werte zu trennen, welcher roter apfel erscheint im direkten weißen licht rot, und im zerstreuten weißen licht blau?
)
aber naja, egal... wie auch immer... jetzt erscheint also eine seite des apfels farbig... die seite, die im schatten ist, hat jetzt nur noch das ambient color, das zusammen mit dem ganzen material zugewiesen würde, also ists doch überall gleich dunkelgrün, oder gleich dunkelgelb oder was weis ich... oder? Das sieht doch totaaal $
Héíße aus, wenn ein roter fleck im schatten plötzlich grün aussieht. Wäre doch viel logischer, einem roten fleck, der -weiß- reflektier und -rot- streut auch -rot- als ambient color zuzuweisen. Und wie mach ich des? 
Bin für alle weitere vorschläge dankbar..
mfg andrey
-
Ich glaube um das effizient zu realisieren mußt Du auf nen shader umsteigen. Allerdings verstehe ich nicht, warum Du nicht einfach das ganze über die diffuse Farbe machst, dann paßt doch alles. Die ambient-Farbe ist doch nur dazu da, daß das Objekt, wenn es garnicht angeleuchtet wird nicht absolut schwarz ist. Und wenn es fast völlig dunkel ist kann man eh kaum Farben erkennen, also genügt ein leichtes grau.
-
moment moment moment moment mal...
bin ich jetzt wegen den gleichen bezeichnungen von verschiedenen farben durcheinandergekommen?
Wofür genau wird denn jetzt die D3DMATERIAL9.Ambient farbe verwendet? Wird die nicht mit dem Licht multipliziert, das durch das renderstate D3DRS_AMBIENT erzeugt wird??Verwendet D3DRS_AMBIENT etwa die Diffuse farbe des vertex??

Und D3DMATERIAL9.Ambient wird also nur bei TOTALER dunkelheit (ohne D3DRS_AMBIENT) verwendet?
Wie unterscheidet sich die dann die Ambient-Farbe von der Emissive-Farbe des Modells?... ich hab wieder mal das gefühl dass ich die frage schon halbbeantwortet hab... muss nochma ganz genau nachlesen wofür diese ganzen farbkomponenten verwendet werden
@Jester: ok, danke sehr, glaube jetzt in etwa zu wissen wo die ursache für mein problem zu finden sein kann

-
Langsam. Die ambient-Farbe wird mit dem aktuellen ambient-Licht multipliziert und dann zur restlichen Färbung hinzuaddiert.
Aber letztlich ist dieser ganze ambient-Kram nur ein Hack, weil echte Beleuchtung so unglaublich komplex is. Eine Fläche muß in Wirklichkeit nicht angeleuchtet werden, damit man sie sieht. Alle Objekte werfen ja auch Licht zurück und erzeugen damit ne gewisse Grundhelligkeit im Raum. Da die Berechnung davon sehr aufwendig ist (Stichwort: radiosity) simuliert man diesen Effekt einfach, indem man mit ambient die Grundbeleuchtung angibt.
D3DRS_AMBIENT verwendet nur die Ambient-Farbe des Vertex. Für das was Du allerdings machen willst solltest Du eher die Diffuse-Farbe verwenden. Immerhin soll ja jeder Punkt seine eigene Farbe bekommen.
Zudem bekommst Du, wenn Du das mit ner Beleuchtung kombinierst auch ein plastischeres Modell, als bei Ambient-Beleuchtung. Durch die gleichmäßige Ausleuchtung sieht das alles immer sehr platt aus.
-
Jester schrieb:
Die ambient-Farbe wird mit dem aktuellen ambient-Licht multipliziert und dann zur restlichen Färbung hinzuaddiert.
Okay.
Da ist jetzt dieser farbige apfel. Er schwebt 1 m über dem boden in einem komplett weiß angestrichenem Zimmer.
Oben hängt eine glühbirne und strahlt weißes licht aus.
Apfel strahlt nichts im sichbarem spektrum aus.
Wände reflektieren weißes licht der glühbirne in abgeschwächter form (D3DRS_AMBIENT mit hellgrau wäre hier doch angebracht, oder?)auf der glühbirnenzugewandten seite ergibt sich für die farbe des Vertex:
Farbe= Lichtstreufarbe * Materialstreufarbe (DIFFUSE-im FVF enthalten) +Glanzkraftberechnung * Materialglanzfarbe (SPECULAR= auch im FVF) +D3DRS_AMBIENT(hellgrau)* Materialhintergrundfarbe (AMBIENT nur mit SetMaterial für das ganze apfel=> dunkelgrau? )auf der glühbirnen-seite sieht es ziemlich gut aus...
auf der schattenseite sieht es aber ziemlich grau aus:Farbe=D3DRS_AMBIENT(hellgrau)* Materialhintergrundfarbe (dunkelgrau)der apfel kann jetzt orange oder vieolett sein: egal, im schatten ist es immer noch grau, obwohl von überall von weißen wänden fast weißes licht kommt, und alles eigentlich gut sichtbar sein sollte... Des kann doch nich stimmen...
-
Nunja, was heißt es stimmt... das ist halt das, was die fixed-function pipeline so hergibt. Sonst setz doch einfach die Ambientfarbe auf ein sattes Apfelgrün. Aber die vernünftige Einfärbung, die von der Position abhängig ist wirste damit kaum hinkriegen.
Ansonsten könntest Du ja auch mal mit Texturen experimentieren. Die sind für solche Details besser geeignet. Oder eben mit nem vertexshader die Berechnung selbst übernehmen und einfach die diffuse-Farbe auch als Ambient-Farbe benutzen in den eigenen Berechnungen.
-
bhehhhehehheee, was heist "details" ?
Wenn man einfach OHNE beleuchtung ein dreieck mit eienr roten, einer blauen und einer grünen ecke zeichnet, gibt es 0 probleme.
Will ich genau dasselbe MIT beleuchtung machen (die ja eigentlich dazu da ist, um möglichst realistische, nicht so "platte" bilder zu erzeugen) , stellt sich plötzlich heraus, dass das dreick nur noch komplett dunkelgrau oder dunkelgrün sein kann, auch wenn er von allen seiten mit hellgrauem licht beleuchtet wird...
Da ist doch irgendwo ein knick in der logik, meint ihr nicht?

-
Nja, texturen... toll, wenn s so ist, könnte man ja gleich alles komplett weiß machen und farbige texturen drufkleben. Das ist aber ein absoluter irrsinn, was speicherplatz angeht.
Was ist, wenn Bilineare Filter nich unterstützt wird? :p für ein simples dreieck mit 3 DWORD werten als farben musste ich also auch noch eine 128x128, 256x256, oder am besten gleich 512x512tx großse textur anlegen? pro dreieck? Um dort die resultate einer Gouraud-Interpolation zwischen drei 32bit großen werten zu speichern?!?
Schon ma eine grafikkarte mit einer integrierten 80 GB festplatte gesehn?^^ 
Also, so wie es aussieht, muss ich mir also doch einen eigenen Vertex shader schreiben... Aber das ist im moment ein bisschen zu Overkill, das mach ich dann später irgendwann mal, wenn die zeit reicht, ansonsten bin ich solang ma mit grauen schatten zufrieden... :p
Danke allen für alle tipps!

-
Andrey schrieb:
Also, so wie es aussieht, muss ich mir also doch einen eigenen Vertex shader schreiben... Aber das ist im moment ein bisschen zu Overkill, das mach ich dann später irgendwann mal, wenn die zeit reicht, ansonsten bin ich solang ma mit grauen schatten zufrieden... :p
Wieso, ist doch ne ganz einfache Sache: bau ne D3DVertexDeclaration9 statt Deinem FVF und lad mit D3DXLoadShaderFromFile einfach nen HLSL Shader. Den einfach vor dem rendern mit SetVertexShader rein und fertig isses.
Ich bin mir auch nicht sicher, inwiefern heutzutage überhaupt noch völlig untexturierte Objekte benutzt werden. Kann ich mir ehrlich gesagt nicht wirklich vorstellen. Aber da weiß z.B. rapso sicher mehr dazu.
-
zu den völlig untexturierten objekten: gut, hast ja auch recht, in einem echten spiel würde man für den apfel oder den asteroiden einfach eine textur verwenden, beim asteroiden noch ne ordentliche bumpmap drufkleben und fertig ist die sache... aber ich wollte erstma nicht so übertrieben realistische objekte zeichnen, und auch keine texturen verwenden
erstma will ich mich auch nicht mit den shadern auseinandersetzen, einfach um zu verhindern, dass ich vor dem rendern des allerersten dreiecks blind einfachdruflos 100 seiten quellcode schreibe, und dann feststelle, dass "irgendwas" ned funzt... will auch ma zwischendurch ein bissl testen, was ich da zusammenbastle
Aber trotzdem danke, um die shader kommt man eh ned drumherum.
-
Andrey schrieb:
erstma will ich mich auch nicht mit den shadern auseinandersetzen, einfach um zu verhindern, dass ich vor dem rendern des allerersten dreiecks blind einfachdruflos 100 seiten quellcode schreibe, und dann feststelle, dass "irgendwas" ned funzt... will auch ma zwischendurch ein bissl testen, was ich da zusammenbastle
Keine Frage, das ist sicher ein sinnvolles vorgehen. Wenn Du allerdings alles soweit hast, daß Du mit der fixed-pipeline ein Dreieck rendern kannst, dann brauchst Du nicht 100 Seiten Code um Shader einzubaun, sondern maximal 100 Zeilen.
-
freut mich zu hören

aber "100 zeilen" != "100 zeilen, wenn man nich rafft was man schreibt"
und da ich im moment noch keeeine ahnung hab wie ich überhaupt so einen vertexshader schreibe, lass ich des liba erstma für n paar tage sein, wenn so das grundgerüst des kompletten programms fertig ist, kann ich ja dann dran weiter rumfeilen, so einen vertexshader einzusetzen erfordert zum glück nicht das Umstrukturieren des ganzen programms.