Spheres, Planes, Deferred Shading, compute shaders

Hello there, today, we are going to talk about too many things.

Firstly, we are going to show you how our engine work, and how to compute a ray sphere, or ray plane intersection.

We are going to talk about optimization too.

So, to begin, we are going to explain how our engine is build.

We use a technique called Deferred Shading.

Into our GBuffer (it’s the name of buffer used in deferred shading), we have 4 + 1 textures.

G-Buffer

We can see that we have 4 important textures, and one less important.

So, now, I’m going to explain what their utilities are.

The color Texture is the basic texture that contains color of each pixel. (RGBA8 : normalized unsigned byte per component)
The position texture is a texture that contains positions of each object projected in the screen. (RGBA32F : float per component)
The normal Texture is a texture that contains normal of each object projected on the screen. (RGBA16_SNORM : normalized signed short per component)
The Distance to the Camera Texture that contains the distance of camera for each position written in the position texture. The same applies to the depth map. (GL_R32F : float for one component).

For example, here are 3 screenshots of Color, Position, and Normal textures.

Capture d'écran de 2014-11-04 19:05:59 Capture d'écran de 2014-11-04 19:09:52 Capture d'écran de 2014-11-04 19:11:43

So, now, we are going to explain the multiple passes in our rendering algorithm.

The first pass, is a rasterization pass, we use a vertex and fragment shaders to do this.
As a reminder, vertex is a processor of vertex, it is invoked one time for each vertex (if you have 1 000 triangles, it’s invoked 3 000 times), and fragment shaders are invoked once time for each pixel.

Our engine works in world space, so, positions, normals are in world position.

To rasterize, we use a simple shader with Frame Buffers (which replace screen, or multiple screens)

So, now, we will explain the maths about Ray Tracing.

As a reminder, here are the respective equations of plane, and spheres.

\left\{\begin{matrix} a\cdot x + b\cdot y + c\cdot z + d &=& &0& \\  (x-pos.x)^2 + (y-pos.y)^2 + (z-pos.z)^2 &=& &R^2& \Leftrightarrow &<xyz - pos, xyz - pos> = R^2&  \end{matrix}\right.

So, your ray begin at position ro (position of Camera), and have a  rd direction.

\left\{\begin{matrix}  x &=& ro.x + t\cdot rd.x \\  y &=& ro.y + t\cdot rd.y \\  z &=& ro.z + t\cdot rd.z & &  \end{matrix}\right.

Now, you just can solve for t the above equations, and you have a position of the intersection object.

But, how can I get a rd vector??

It’s really easy.

Projection\cdot View\cdot rd = (x,y,1.0,1.0) \\  \Leftrightarrow rd = (Projection\cdot View)^{-1}\cdot(x,y,1.0,1.0)

The signification of « 1.0 » for the z component here is : « far plane ».

Now, to optimize the sphere computing, you only have to draw one cube with rasterization, and, in a shader, you can do a computing, so, instead of computing of all your pixels, you compute only in a little area in your screen. It’s a power of deferred shading.

Ohhhh, I have a problem : Spheres are cut …

Capture d'écran de 2014-11-04 22:23:09

It’s because you have to use a infiniteProjection (glm see around of infinitePerspective).

For the plane, my advise is to use Compute Shaders instead Fragment shaders. Indeed, if you put plane in shared memory (equivalence to L1 cache), you obtain a little gain in performance.
Indeed, shared memory is about 100 times faster than global memory, so if you have a big number of accesses of your buffers, it’s better to use shared memory ^^.

Now, we can draw lights and shadows ^^.

But it will be for the next article ^^.

Bye 🙂 .

Publicités

4 réflexions sur “Spheres, Planes, Deferred Shading, compute shaders

  1. Hello,
    I had a look at your blog.

    I’m a newbie, so I cannot really appreciate what you are telling here, I just understand a piece here and there. (By the way I found some english mistakes that do not help my understanding.) (My mother tongue is french, but if you want and if you ask for it, I may deliver some corrections proposals).

    Anyway, what I understand is very interesting. I hope you will continue the good work !

    Jean-David

    J'aime

    1. Hello, if your mother tongue is french, I’m going to answer in french ^^.

      Tout d’abord, merci de ta réponse, et merci pour les encouragements ^^.

      Oui, je sais que mon anglais n’est pas du tout parfait, loin de là d’ailleurs, à mon grand regret x).
      Donc oui, si tu as trouvé des fautes et que tu souhaites m’aider à les corriger, j’en suis évidemment ravis, l’idée de faire ce blog en anglais est aussi d’essayer de progresser ^^. J’espère néanmoins que mes erreurs ne nuisent pas à la bonne compréhension de mes articles…

      Après tu dis que tu es un débutant, si il y a des choses que je peux éclaircir ou quoi que ce soit, tu peux demander, en commentaire sur ce blog, ou par mail, je pourrais t’éclaircir sur les endroits que tu ne comprends pas, ou même si tu souhaites que je détaille un peu plus certains passages que tu considères comme trop technique, je peux le faire, et cela m’aidera aussi pour la suite de mes articles ^^.

      Voilà, encore merci de ton commentaire.
      Antoine 🙂

      J'aime

  2. Salut,
    Merci de ta réponse, et voilà donc mes proposisions de corrections.
    Je vais les formuler d’une manière qui peut te sembler bizarre, mais à la longue elle a ses avantages.

    En première ligne je mets la ligne telle qu’elle existe actuellement (ainsi tu peux copier coller et trouver dans ton texte)
    Sur les suivantes, j’indique la même ligne avec les corrections que je propose. (plus parfois une parenthèse pour expliquer ou décrire le changement)

    about too many things (tu veux parler de « trop nombreuses choses »?) (je me demande si tu ne voulais pas dire de « 2 choses principales » ce qui se dirait « two main things », mais je n’en suis pas sûr. Donc ceci n’est pas une faute, juste un doute de ma part.

    So, to begin, we are going to explain how is build our engine.
    So, to begin, we are going to explain how our engine is build. (je pense que c’est plus juste)

    So, now, I’m going to explain what are their utilities.
    So, now, I’m going to explain what their utilities are.

    The color Texture is the basic texture own color of each pixels.
    The color Texture is the basic texture own color of each pixel. (dernier mot au singulier)

    of each objects
    of each object (idem) (à 2 endroits)

    projected in the screen
    projected on the screen (me semble mieux, mais tu peux ne pas être d’accord)

    The Distance To Camera Texture own the distance of camera for each position write in the position texture.
    The Distance To Camera Texture owns the distance of the camera for each position written in the position texture.
    (3 choses:
    1) own : je ne sais pas si tu l’utilises en tant que verbe (~détenir) ou pour dire « le sien ». Si c’est le verbe, commme je le pense, alors il faut savoir qu’à la 3ème personne du singulier (il, elle) , les anglais ajoutent un s final au verbe ==> owns. Si c’est le verbe donc il faudrait corriger, ainsi que peut-être pour les lignes précédentes : par exemple pour une des lignes juste avant :
    The normal Texture is a texture own normal
    The normal Texture is a texture that owns the normal )

    2) j’aurais tendance à vouloir ajouter un the avant camera.

    3) written (écrite) me semble mieux que write (sauf si tu as voulu dire : écriture de position : utilisation de write comme un nom)

    Is like a depth map
    It is like a depth map serait peut-être mieux, ou même
    The same applies to the depth map (il me semble que c’est celui là qui irait le mieux, car je vois que tu ne parles plus du depth map ensuite)
    It’s type is like that of the « depth map » (selon ce que tu veux dire sont-ils en tout point pareils, ou n’est-ce que le type qui est pareil?)
    It’s type is the same as that of the « depth map » (aussi possible)

    in our algorithm of rendering
    in our rendering algorithm

    To remind
    To remind you …me semble mieux.
    As a reminder …encore meux. (si ce que tu veux dire est: « pour rappel »)

    it is invocate
    it is invoked

    it’s invocate 3 000 times
    it’s invoked 3 000 times et encore la même correction à faire une 3ème fois dans cette même phrase

    Our engine work
    Our engine works (car 3ème pers. du singulier)

    So, now, we will explain maths about Ray Tracing.
    So, now, we will explain the maths about Ray Tracing. (un peu subjectif de dire que c’est mieux, c’est vrai)

    We reming
    We remind
    As a reminder, here are the respective equations… me semblerait encore mieux.

    Now, you just can solve for t above equations, and you have a position of intersection object.
    Now, you just can solve for t the above equations, and you have a position of the intersection object.
    Now, you just can solve for t the above equations, and you have a intersection position for the object. (une autre proposition, mais je doute)

    The 1.0 for z component significate here « far plane ».
    The signification of « 1.0 » for the z component here is : « far plane ». (pas de verbe significate à ma connaissance)

    Now, for optimize sphere computing, you have just to
    Now, to optimize sphere computing, you only have to
    Now, to optimize the sphere computing, you only have to

    so, instead of compute of all your pixels
    so, instead of computing of all your pixels

    you do a compute only in a little area in your screen
    you compute only in a little area in your screen

    Spheres are cup
    Spheres are cut ?
    The sphere is cut (je ne vois qu’une sphère) (en cherchant bien j’ai vu la 2 ème, donc non ceci n’est pas bien)
    Spheres and rectangles are cut?
    Objects are cut?

    For the plane, I council to
    For the plane, I advise you to
    For the plane, my advice is to (ma préférence)

    so if you have a big number accesses of your buffers
    so if you have a big number of accesses to your buffers
    so if you have a lot of accesses to your buffers (ma préférence : 2 choses : a lot of, mais aussi « to » qui remplace le dernier « of »)

    Now, we can draw a lights and shadows
    Now, we can draw a « lights and shadows »
    Now, we can draw a light and shadows
    Now, we can draw lights and shadows (ma préférence) (le problème avec « a lights » c’est que « a » dénote le singulier, et « lights » est au pluriel) (le pluriel de « a » est de ne mettre aucun mot)

    Voilà, tout ceci est à prendre avec des pincettes, car encore une fois je ne suis pas anglophone, et de plus je ne comprends pas bien le sujet.

    Je te remercie beaucoup pour ta proposition de m’aider à progresser, et je te poserai peut-être quelques questions quand je ne comprendrai pas bien quelque chose.
    Mais le risque c’est que mes questions auront probablement pour sujet ce que je cherche à faire sans y arriver qu’autre chose. Pour l’instant je me suis mis à divers cours sur divers sites, dont le tien (je crois) sur open Gl sur openclassrooms que je vais survoler, pour tenter d’assimiler certains points de théorie, en étant conscient que ce n’est pas la dernière version.

    Dernière chose, quand tu auras fait d’éventuelles corrections, je pense que ces commentaires n’auront plus lieu d’être et donc sens-toi libre de les effacer, en tout cas celui-ci, je ne serai pas vexé. (Ou demande-moi [movingmazes@yahoo.com] de le faire ou de les éditer, ainsi je pourrai tout de même garder la partie qui ne concerne pas l’anglais : )

    J'aime

    1. Je te remercie énormément pour ton aide.
      Je n’ai pas écris de tutoriel sur OpenGL. J’ai voulu en faire un une fois, mais je n’étais pas expérimenté, comme tu as pu le voir dans les critiques sur l’ancienne version Bêta de mon tutoriel.

      Si le sujet t’intérèsse (OpenGL dans sa globalité, pas seulement le ray tracing (qui n’est pas du tout le point fort d’OpenGL, sois dit en passant)), voilà quelques liens qui pourraient t’aider.
      Le premier est mon préféré, mais aussi le plus compliqué car c’est rapide ^^. Mais pareil, si tu as une quelconque question, n’hésites pas :).

      http://ogldev.atspace.co.uk/
      http://www.opengl-tutorial.org/
      http://openclassrooms.com/courses/developpez-vos-applications-3d-avec-opengl-3-3

      Après, pour des domaines plus poussés, il n’y a a rien de mieux que les papiers de recherches ^^.

      J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

w

Connexion à %s