Posts by klj

    Hallo,


    vorweg mal allgemein, würde ich abraten vor veralteten debugging Tools, besonders bei OpenGL unterscheiden die Versionen 3.0+ deutlich von den Vorgängerversionen, deshalb sollte man wirklich acht geben, ob das Tool auch das eigene Environment unterstützt, sonst macht die Verwendung das Debuggen meist nur schwieriger, weil die Tools Probleme zeigen, die gar keine sind (siehe auch Towlies Post).


    Grundsätzlich sollte man wie Stefan oben erwähnt hat, mit CodeXL (Nachfolger von gDEBugger) viele Probleme lösen können, wobei wirklich Zeile für Zeile durch einen Shadercode durchsteppen, meiner Meinung nach, allein durch die Parallelisierung und Komplexität der Grafikkarte nicht möglich sein wird. Auch auf Nvidia wüsste ich kein Tool, das das könnte.


    Bezüglich dem Problem würde ich, wie Towlie bereits erwähnt hat, mir das Memory Layout anschauen, da OpenGL wenn man es nicht anders spezifiziert, alle Daten in vec4 umwandelt, wodurch ihr Leerbits beim Übergeben berücksichtigen müsst, wenn ihr zum Beispiel nur vec3 übergeben wollt oder ihr ein passendes Memory Layout wählen müsst.

    Es kann bei so vielen Gruppen passieren, dass wir den einen oder anderen Effekt im Spiel nicht finden. Unter anderem deshalb habt ihr ja auch noch Zeit, bis zum Spieleevent nachzubessern, wo dann im Endeffekt die finalen Punkte entschieden werden. Zeige uns bei der Präsentation einfach, wie man diese Fensterscheiben sieht und du wirst die Punkte dafür zurückbekommen.
    Beachte bei der Transparenz bitte, dass die Scheibe nicht komplett durchsichtig ist, sondern auch ein Blendeffekt sichtbar ist, da es sonst für uns nicht eindeutig ist, ob man beim Einschalten der Transparenz nicht einfach das Rendering der Scheibe ausschaltet.

    Wenn post processing Effekte verwendet werden, sollte man für den Wire-Frame Mode, ihn zwar für das Rendern der Szene (in das FBO oder wie auch immer eure Pipeline aussieht) einschalten, aber für das weitere Verarbeiten den Wire-Frame Mode ausschalten, da sonst lediglich der Wire-Frame des Full Screen Quads sichtbar ist und sonst nichts.

    Hallo,


    wenn ich den Shader teste, dann habe ich keine gültigen UV-Koordinaten im Fragment-Shader, vielleicht solltet ihr überprüfen, ob hier vielleicht der Fehler liegt.

    Code
    1. Color = vec4(frag_in.FragmentUV, 0.0f,1.0f);


    ergibt eine schwarze Waterplane und mit abs() ebenso, wodurch wirklich 0en oder NaNs in UV drinnen stehen werden.

    Hallo,
    an den von dir genannten Codestellen kann ich keinen Fehler erkennen. Poste mal einen Screenshot und gib an wo die lightPosition ist.
    Zusätzlich will ich nochmals auf das Repetitorium verweisen: Bisher hast du nur den ersten Teil beachtet, bitte PCF einbauen, was das Ergebnis nicht nur schöner, sondern den Algorithmus auch einfacher macht, weil OpenGL hier einige Schritte für dich übernehmen kann. Ebenso ist PCF für die Effektpunkte verpflichtend!

    Hast du einen Debug-Context implementiert und kommen dort vielleicht OpengGL-Errors bzw gibt glGetError() GL_NO_ERROR zurück?
    Ansonsten bitte nochmals überprüfen:
    - wurden die Varyings wirklich vor dem Linken gesetzt bzw auch nicht vom Compiler wegoptimiert (glGetTransformFeedbackVarying())
    - wird vor dem Zeichnen auch glBeginTransformFeedback() und danach glEndTransformFeedback() aufgerufen
    - wurde für den Feedbackbuffer auch Speicher angelegt (man kann nur so viel in einen Transformfeedback-Buffer schreiben, wie hineinpasst (glBufferData()))

    Hallo, anhand diesen kleinen Codestücks kann man schwer eine genaue Antwort geben.
    - Grundsätzlich fällt mir auf, dass ihr anscheinend einen normalen sampler statt einem shadow Sampler verwendet.. gibt es dafür einen Grund?
    - Weiters sieht es auch nicht nach PCF aus, was für die Effektpunkte verpflichtend ist (kann leicht mithilfe eines shadow Sampler implementiert werden)
    - wenn die Variable Bias dafür da sein soll, shadow artifacts zu entfernen, so gibt es eine gängigere Variante mit glPolygonOffset.


    Welches tutorial habt ihr zum implementieren verwendet? Ich würde euch die Folien vom Repetitorium empfehlen, dort sollten die oben genannten Dinge berücksichtigt werden.

    Es stellt sich überhaupt die Frage, ob du die genauen Objekte von Assimp in PhysX haben willst oder ob nicht Bounding-Boxes bzw Bounding-Spheres ausreichend sind. Man kann zwar auch komplexe Modelle in PhysX reinladen, aber dies beeinträchtigt natürlich die Performance. Überlegt also zuerst mal, ob ihr wirklich komplexe Objekte für eure Physik benötigt!

    Grundsätzlich sieht der Codeteil den du gepostet hast richtig aus. Es scheint so, als würde es ein Problem mit der Lifetime geben. Probier mal, ob durch das Entfernen des IFs nach dem ELSE auch noch immer 0 Partikel den Geometry Shader verlassen. Wenn ja, dann überprüfe einerseits ob vom Vertex-Shader die richtige Lifetime in fLifeTimePass[0] übergeben wird und weiters ob das Uniform fTimePassed richtig gesetzt ist.

    Ich hatte auch ein Mal eine ähnliche Fehlermeldung von NSight, als ich eine OpenGL Funktion verwendet habe, die zwar in OpenGL dem Standard entsprochen hat, aber in NSight nicht implementiert ist. Mir wurde dann in C:\Users\[User]\Documents\NVIDIA Nsight ein File abgelegt, das die entsprechende Funktion enthält. Vielleicht habt ihr dort auch ein "nvcompatlog.txt" Dokument!

    Hallo!
    In einem FBO müssen alle Texturen dieselbe Größe haben, sonst ist das FBO nicht gültig. Wenn du zB die halbe Auflösung haben willst, kannst du für die Textur Mipmaps erstellen und den Level 1 auslesen (für viertel Auflösung Level 2 usw.)

    Das Ergebnis hat für mich ebenso ausgesehen, wie auf deinem Screenshot. Das Fehlen der Texturen muss, aber dann im "ersten" Renderpass geschehen, weil der "zweite" Pass nur mehr die Textur des FBOs zeichnet.


    Bezüglich Performance sollte sich das Rendern eines Fullscreen Quads nicht so sehr auswirken (auch wenn es sich natürlich je nach Window-Größe mehr oder weniger auswirkt). Überprüft hier am besten nochmals eure ganze Pipeline auf Performanceissues, weil selbst für eure restliche Szene sind 60 FPS schon eher wenig und vielleicht kommt ihr dann auch drauf, wieso die Performance mit FBO deutlich schlechter wird.


    Bezüglich VAO eine kurze Info: im VAO ist auch das Binding von ARRAY_BUFFER gespeichert, also wenn ihr die ARRAY_BUFFER beim initialisieren des VAOs einmal bindet, dann merkt sich das das VAO und bindet selbst die entsprechenden Buffer (dementsprechend sind in deinem zweiten Screenshot die glBindBuffer-Befehle vor und nach dem Draw redundant)

    Hast du beim Framebuffer eh wieder ein unbind gemacht? Sonst wird nämlich das Fullscreen Quad mit der Framebuffertextur wieder in den Framebuffer und nicht in den Backbuffer gezeichnet!


    *EDIT*
    Hab mal euer Repo runtergeladen und hab es auch mit Framebuffer zum Laufen gebracht.
    Ihr habt im Grunde nur vergessen, dass auch euer Fullscreen Quad ein VAO zum Zeichnen benötigt. Hier sollte eigentlich auch ein GL Fehler geworfen werden, wenn kein VAO zum Zeichnen verwendet wird. Es würde euch sehr helfen, wenn ihr einen Opengl-Debug-Context implementieren würdet oder zumindest ein mal pro Frame glGetError checkt!

    Hallo,


    rein theoretisch sollte das Bild natürlich Pixel-für-Pixel gleich sein, wie in der Musterlösung. Wie du bereits richtig gesagt hast, kann man bei den Intervallgrenzen sich aussuchen, wie man diese behandelt, aber das wird unser Testskript dann auch auf jeden Fall berücksichtigen.


    Ich hoffe das beantwortet deine Frage!

    Hallo,
    bezüglich der ersten Frage, sollte das eigentlich schon so funktionieren. Die Frage ist eher, was passiert mit der Variable modelMatrix vor den zwei Zeilen? Wenn sie nicht initial auf die Identitymatrix gesetzt wird, kann es sein, dass sie uninitialisiert ist und deshalb willkürliche Werte drin stehen.


    Das zweite Problem besteht daraus, dass ihr mit dem Code auch wirklich eine Spiralbewegung erzeugt und keine Kreisbahn, weil ihr euch immer tangential zu eurer Kreisbahn weiterbewegt. Wenn der Orbit "flach" um die z-Achse sein soll, kann man einfach sagen:

    Code
    1. x = sin(t);
    2. y = cos(t);
    3. position = [x,y,0] * distanceFromPlanet;

    Hallo,


    ich habe euer Projekt durchgeschaut und mir sind ein paar Dinge aufgefallen. Der Grund für euer Problem ist, dass ihr annehmt, dass der Shadercompiler die Variablen in der Reihenfolge verarbeitet, wie es bei euch in der Datei steht. Das ist jedoch aufgrund von Optimierungen etc nicht der Fall, wodurch es von selbst nicht gegeben ist, dass das Attribut Position die Location 0 hat, wenn es im File an erster Stelle steht. Da gibt es zwei Möglichkeiten, wie ihr das Problem lösen könnt:
    1) Ihr fragt mit glGetAttribLocation ab, an welcher Location das Attribut steht oder
    2) Ihr "zwingt" den Shadercompiler dazu, dass er das Attribut Position auf die Location 0 setzt mit folgendem Code

    Code
    1. layout(location = 0) in vec3 position;


    Zu den anderen Error Messages kann ich nicht viel sagen, da ich aufgrund fehlender dlls auch euer Programm nicht starten kann. Aber die Uniform-Fehlermeldungen können daher kommen, dass ihr versucht Uniforms mit Daten zu belegen, die vom Compiler wegoptimiert werden, wenn sie nicht verwendet werden (wie zum Beispiel

    Code
    1. uniform vec4 worldEye; uniform vec4 worldLight;

    in eurem texture_light.frag Shader)


    Grundsätzlich könnt ihr bei Fehlermeldung die OpenGL Reference Pages zur Hand nehmen, weil dort steht genau spezifiziert, welcher Befehl unter genau welchen Umständen welchen Fehler wirft. (https://www.opengl.org/sdk/docs/man4/)