BlinnGouraud - shininess an falscher Stelle

  • Hallo


    mein materials test sieht so aus.


    Unbenannt.jpg


    Ich kann leider den Fehler nicht finden. Muss man bei BlinnGouraud sowohl lambertian als auch blinn addieren und it der Lichtintensitaet multiplizieren ?
    Ansonsten ist BlinnGouraud ja identisch mit LambertGouraud ? Also shadeFragment gibt nur die Farben und an 4.Stelle alpha als Vec4 zurueck.


    Vielen Dank fuer Eure Hilfe.

  • Hallo jobell34,


    Quote

    Muss man bei BlinnGouraud sowohl lambertian als auch blinn addieren und it der Lichtintensitaet multiplizieren ? Ansonsten ist BlinnGouraud ja identisch mit LambertGouraud ?


    das Gouraud Shading zeichnet sich dadurch aus, dass es das Beleuchtungsmodell im Vertex-Shader ausgewertet wird. Im Fall von Lambert wirst du daher das IlluminationModels.lambert(...) und im Fall von Blinn wirst du das IlluminationModels.blinn(...) in shadeVertex aufrufen.


    Hier eine Abkürzung der Vektoren, die ich anschließend verwende:
    N... Oberflächennormale
    L... Vektor, der in Richtung der Lichtquelle zeigt
    V... Vektor, der in Richtung des Betrachters zeigt

    1.) Bei Lambert gibt es nur eine diffuse Beleuchtung. Diese berechnet sich aus dem dot-Produkt der Oberflächennormale N und dem Vektor L, der in die Richtung der Lichtquelle zeigt. Das Ergebnis dieses dot-Produkts multiplizierst du dann mit der diffuseColor die dein Shader bekommt. Dieses Ergebnis musst du dann noch mit der calcIntensity(...) deiner aktuellen Lichtquelle multiplizieren. Das ganze machst du jetzt für alle Lichtquellen (der Shader bekommt ja ein Array lights[] ) und addierst diese zu einer Gesamtintensität auf.


    2.) Bei Blinn gibt es sowohl eine diffuse Beleuchtung, als auch eine specular Beleuchtung.


    Der diffuse Teil berechnet sich wie oben bei Lambert beschrieben (dopt-Produkt von N und L). Das Ergebnis multiplizierst du dann wie gewohnt mit der diffuseColor. --> nennne wir das Ergebnis mal diffusePart

    Der speculare Teil berechnet sich wie folgt: zunächst benötigst du einen Halfway-Vektor H (dieser "halbiert" die Vektoren L und V). Den erhältst du wenn du die beiden Vektoren V und L addierst und das Ergebnis normalisierst. Als nächstes berechnest du dir das dot-Produkt von N und H und rechnest dieses Ergebnis hoch shininess (der shininess - Exponent bestimmt die Größe des Glanzpunktes). Dieses Ergebnis multiplizierst du dann mit der specularColor die der Shader bekommt. --> nennen wir das Ergebnis mal specularPart

    Jetzt wollen wir noch die beiden Teile diffusePart und specularPart "zusammenführen". Dabei addierst du sie einfach auf und multiplizierst das Ergebnis dieser Addition mit der aktuellen calcIntensity(...) deiner aktuellen Lichtquelle. Das musst du dann natürlich auch wieder für alle Lichter in lights[] machen.


    Weißt du jetzt besser was zu tun ist?


    Liebe Grüße,
    Tommy T.

    Thomas Trautner


    EDBV - Tutor WS 2016/17; ECG - Tutor WS 2015/16, WS 2016/17
    CG UE - Tutor SS 2015, SS 2016; EVC - Tutor SS 2014, SS 2015, SS 2016

    Edited once, last by Tommy T. ().

  • Hallo Tommy


    Vielen Dank fuer Deine ausfuehrliche Erklaerung! Ich habe meinen Code mit Deiner Beschreibung verglichen. Ich glaube er macht das Gleiche. Weisst Du vielleicht wie ich die Spiegelung oben statt mittig im Rendertest erklaeren koennte. Stimmt da irgendein Vektor nicht ? Wie koennte ich das am besten debuggen.


    Ich habe jetzt die Richtung des View Vectors umgedreht also links P
    Vec3 V = Vec3.sub( P,_cameraLocation).normalize();


    nun sieht es so aus


    Unbenannt.PNG


    Any ideas...


    Vielen Dank


    Lg


    Rupert

  • Hallo jobell34,
    wie du sicher weißt berechnet sich ein Vektor, der von A nach B zeigt durch B-A, sprich "Spitze des Vektors minus dem Schaft des Vektors.


    Quote

    Vec3 V = Vec3.sub( P,_cameraLocation).normalize();


    Das ist leider nicht richtig, der Vektor V soll von P in Richtung der Camera zeigen, also genau anders herum!


    Das Gleiche gilt auch für L, der Vektor der von der surfacePosition zur Position des Lichtes in Weltkoordinaten zeigt.


    Was mir noch einfällt:
    Kann es sein, dass du vergisst manche Vektoren zu normalisieren? Beispielsweise N und V?
    Achtung: P darf beispielsweise nicht normalisiert werden (überleg dir warum!)


    Bzw. vermute ich, dass manche Vektoren von dir im falschen Space sein könnten.
    Im Shader solltest du die Vertex-Position mit der Model-Matrix und die Vertex-Normalen mit der Normal-Matrix multiplizieren.


    Kontrollier das bitte noch einmal!


    Liebe Grüße,
    Tommy T.

    Thomas Trautner


    EDBV - Tutor WS 2016/17; ECG - Tutor WS 2015/16, WS 2016/17
    CG UE - Tutor SS 2015, SS 2016; EVC - Tutor SS 2014, SS 2015, SS 2016

    Edited once, last by Tommy T.: minor error ().

  • Hallo Tommy


    Du meinst von Camera in Richtung P ? Sonst waere Vec3 V = Vec3.sub( P,_cameraLocation).normalize();


    richtig - oder ?


    Liebe Gruesse


    Rupert

  • Hallo jobelll34,
    war leider eine kleine Ungenauigkeit von mir. Das habe ich gemeint:


    Der Vektor V soll von P in Richtung der Camera zeigen, also genau anders herum!
    Deswegen ist dein Code so leider falsch.


    Quote

    Wie du sicher weißt berechnet sich ein Vektor, der von A nach B zeigt durch B-A, sprich "Spitze des Vektors minus dem Schaft des Vektors.


    Liebe Grüße,
    Tommy T.

    Thomas Trautner


    EDBV - Tutor WS 2016/17; ECG - Tutor WS 2015/16, WS 2016/17
    CG UE - Tutor SS 2015, SS 2016; EVC - Tutor SS 2014, SS 2015, SS 2016

    Edited 2 times, last by Tommy T. ().

  • Ich finde den Fehler einfach nicht ... Alles ist so wie es sein sollte (oder offensichtlich nicht?). Kann ich Dir vielleicht den code per PM schicken ?


    Vielen Dank


    LG


    Rupert

  • Hallo Rupert,

    Quote

    Kann ich Dir vielleicht den code per PM schicken ?


    das geht leider nicht, deswegen bieten wir die Laborbetreuungen im VisLab an (Lageplan: https://www.cg.tuwien.ac.at/resources/maps/cg/).
    Komm einfach am 14.12.2016 zwischen 17-19:00 vorbei und die dort anwesenden Tutoren schauen mit dir gemeinsam noch einmal über deinen Code drüber!


    Liebe Grüße,
    Tommy T.

    Thomas Trautner


    EDBV - Tutor WS 2016/17; ECG - Tutor WS 2015/16, WS 2016/17
    CG UE - Tutor SS 2015, SS 2016; EVC - Tutor SS 2014, SS 2015, SS 2016

  • Hi Tommy


    problem solved. Die Kameraposition war falsch berechnet... Also fuer Alle die den shininess spot an der falschen Stelle haben (so wi ich oben) auch kontrollieren ob die Kamerakoordinaten richtig berechnet wurden.


    Vielen Dank Noch!


    Lg