Specular Highlighting will nicht
-
Hi Leute!
Hab ein Problem vor dem ich jetzt schon Tage lang grübel.
Ich hab hier ein Modell das mit einer Punktlichtquelle beleuchtet wird.
Die Material-Eigenschaften sind so verteilt, das es eigentlich eine sehr
starke Specular-Reflektion abgeben sollte. Tut es aber nicht. Das heisst, es geht wenn ich das Model ohne Texturen rendere. Mit Texturen werden die betreffenden Bereiche nur heller - Es gibt aber nicht das typische "Highlighting". Woran liegt das ?
-
Ist's wirlich überall angestellt?
Bye, TGGC (Just think about it)
-
Hm, wenn Du ohne Textur nen weissen Flecken siehst könnte das auch diffuses Licht sein. Sobald Du ne Textur hast, wird die drübergemalt (MODULATE).
Spekular-Licht sollte auch auf Textur zu sehen sein. Haste Material und Normale und so alles definiert?
-
Die Materialien sind definitiv ok. Habs mit einem Modell-Editor unter den Material/Licht Einstellungen getestet.
Allerdings bin ich mir nicht sicher, ob meine Normalen-Berechnung ok ist.
Kann das mal jemand prüfen ?
Hier ist mein Code:CVertex CGLRenderer::CalcNormalVector(CFace *pFace, CMesh* pMesh) { CVertex NormalVector; NormalVector.nX = 1; NormalVector.nY = 1; NormalVector.nZ = 1; if (pFace->nPolyType < 3) return NormalVector; CVertex* pV1 = &pMesh->pVertexData[pFace->pVertexRefs[0]]; CVertex* pV2 = &pMesh->pVertexData[pFace->pVertexRefs[1]]; CVertex* pV3 = &pMesh->pVertexData[pFace->pVertexRefs[2]]; CVertex N1; N1.nX = pV2->nX - pV1->nX; N1.nY = pV2->nY - pV1->nY; N1.nZ = pV2->nZ - pV1->nZ; CVertex N2; N2.nX = pV3->nX - pV1->nX; N2.nY = pV3->nY - pV1->nY; N2.nZ = pV3->nZ - pV1->nZ; NormalVector.nX = N1.nX * N2.nX; NormalVector.nY = N1.nY * N2.nY; NormalVector.nZ = N1.nZ * N2.nZ; return NormalVector; }
Meine Vertex-Klasse ist noch nicht so ganz vollständig. Deshalb dieser Umständliche Weg
pV1, pV2 und pV3 sind die ersten 3 Vertices der Fläche. Damit versuche ich
die Normale zu bestimmen.(edit)
Also um das Chaos mal zu übersetzen:
NormalVektor = (V2 - V1) * (V3 - V1)
-
Zeig die Normalen einfach mal rasch an, dann siehste sofort, ob die stimmen..
-
Cpp_Junky schrieb:
NormalVector.nX = N1.nX * N2.nX; NormalVector.nY = N1.nY * N2.nY; NormalVector.nZ = N1.nZ * N2.nZ; }
schaut nach ner art dotproduct aus, also eher falsch.irgendwo hier im forum wurden vor kurzen zig beispiele für die berechnung der normale gegeben, pick dir eine heraus.
rapso->greets();
-
rapso schrieb:
irgendwo hier im forum wurden vor kurzen zig beispiele für die berechnung der normale gegeben
Angeblich findet man sie sogar bei google...
Bye, TGGC (Just think about it)
-
und nicht vergessen das renderstate D3DRS_SPECULARENABLE auf true zu setzen...
-
Es ist OpenGL
-
Ok, die Normalen stimmen jetzt auch. Hab im Model-Editor eine Option gefunden die Normalen direkt in die Model-Datei zu exportieren. Von daher sollten die wohl stimmen
Das Lighting an sich sieht jetzt auch schon wesentlich besser ausMein "Highlighting" klappt aber immernoch nicht. Vielleicht liegts doch an
den Materialien
Das müsste doch ziemlich "highlighten" () oder ?
Material Code:Ambient = { 0.3, 0.3, 0.3, 1.0 } Diffuse = { 0.7, 0.7, 0.7, 1.0 } Specular = { 0.5, 0.5, 0.5, 1.0 } Emissive = { 0.0, 0.0, 0.0, 0.0 } Shininess = 60
-
Cpp_Junky schrieb:
Es ist OpenGL
oh...
-
Die Materialien sehen gut aus so. Zum Debugen würde ich aber pro Lichtart eine spezielle Farbe wählen (z.B. Spekular=Blau), so siehst Du sofort was Sache ist..
-
Hab mein spekulares Licht mal Rot gefärbt. Das Model wird davon beleuchtet. Es "highlighted" aber trotzdem nicht, sondern wird nur etwas heller als der Rest. Müssen meine Texturen vielleicht irgendeine bestimmte Eigenschaft besitzen, damit die "Highlight Spots" auf die Textur kommen ?
-
Ne, mit der Textur hat das nichts zu tun.
Hm, mach mal die Shininess etwas mehr, z.B. 128.0Naja, je nach Model sieht der "Glanzeffekt" eh nicht allzugut aus, dazu müsste man Phong Shading nehmen.
Mach sonst mal n'Screenshot, damit wir sehen können wies aussieht...
-
Hmmm, ich hab mittlerweile durch endloses rumgeforsche rausgefunden das die Highlight-Spots nur bei untexturierten Flächen möglich sind. OpenGL bügelt den Effekt wohl durch die Textur vollkommen über. Möglich soll es aber über eine Extension sein, mit der man die Reihenfolge von Licht und Textur Rendering ändern kann. Oder man benutzt gleich Environmental-Mapping
-
Cpp_Junky schrieb:
Hmmm, ich hab mittlerweile durch endloses rumgeforsche rausgefunden das die Highlight-Spots nur bei untexturierten Flächen möglich sind. OpenGL bügelt den Effekt wohl durch die Textur vollkommen über. Möglich soll es aber über eine Extension sein, mit der man die Reihenfolge von Licht und Textur Rendering ändern kann. Oder man benutzt gleich Environmental-Mapping
Hmm, jo OpenGL kombiniert ja das Licht mit der Textur, d.h. ein restlos weisser Fleck kriegste nicht hin. Aber nen Glanzeffekt lässt sich trotzdem ganz gut realisieren.
Wenn Du die Textur mit dem Licht "übermalen" willst, dann zeichne erst dein Licht alleine und addiere dann in einem zweiten pass die Textur dazu.Was ist das für ne Extension? Das näm mich auch Wunder, haste nen Link dazu?
-
durito schrieb:
Cpp_Junky schrieb:
Hmmm, ich hab mittlerweile durch endloses rumgeforsche rausgefunden das die Highlight-Spots nur bei untexturierten Flächen möglich sind. OpenGL bügelt den Effekt wohl durch die Textur vollkommen über. Möglich soll es aber über eine Extension sein, mit der man die Reihenfolge von Licht und Textur Rendering ändern kann. Oder man benutzt gleich Environmental-Mapping
Hmm, jo OpenGL kombiniert ja das Licht mit der Textur, d.h. ein restlos weisser Fleck kriegste nicht hin. Aber nen Glanzeffekt lässt sich trotzdem ganz gut realisieren.
Wenn Du die Textur mit dem Licht "übermalen" willst, dann zeichne erst dein Licht alleine und addiere dann in einem zweiten pass die Textur dazu.Was ist das für ne Extension? Das näm mich auch Wunder, haste nen Link dazu?
multiplizieren,nicht addieren, sonst ist das endergebis unnatürlich hell
-
Man, is dieses OGL scheisse...
Aber mal im Ernst, das muss doch gehen! Sicher das du es nicht doch irgendwo selbst verzockst?
Bye, TGGC (Just think about it)
-
@otze: ich mein schon addieren, er will ja wohl das Spekularlicht "unnatürlich hell" sprich weiss. Also nur den Glanzeffekt zeichnen und dann zum "normalen Bild" addieren.
@TGGC: stimmt, D3D hat n'ganz anderes Lichtmodell
-
@TGGC:
Ne is wirklich so. Man kann es nur über Umwege lösen - Zwei Rendering, Environmental-Mapping, Textur drüberblenden, diese komische Erweiterung o.ä.Kannst das Problem hier direkt bei opengl.org nachlesen:
http://www.opengl.org/resources/faq/technical/texture.htm
(FAQ Nummer 21.040)