gKit2 light
Loading...
Searching...
No Matches
pipeline.cpp File Reference
#include <cstdio>
#include <cmath>
#include "vec.h"
#include "mat.h"
#include "mesh.h"
#include "image.h"
#include "image_io.h"
#include "orbiter.h"
#include "wavefront.h"

Go to the source code of this file.

Classes

struct  ZBuffer
struct  Fragment
struct  Pipeline
struct  BasicPipeline

Functions

float area (const Point p, const Point a, const Point b)
bool visible (const Point p)
int main (int argc, char **argv)

Function Documentation

◆ area()

float area ( const Point p,
const Point a,
const Point b )

Definition at line 107 of file pipeline.cpp.

108{
109 Vector pa= Vector(p, a); pa.z= 0;
110 Vector pb= Vector(p, b); pb.z= 0;
111 return cross(pa, pb).z;
112}
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
Definition vec.cpp:173
representation d'un vecteur 3d.
Definition vec.h:67

◆ visible()

bool visible ( const Point p)

Definition at line 115 of file pipeline.cpp.

116{
117 if(p.x < -1 || p.x > 1) return false;
118 if(p.y < -1 || p.y > 1) return false;
119 if(p.z < -1 || p.z > 1) return false;
120 return true;
121}

◆ main()

int main ( int argc,
char ** argv )

Definition at line 124 of file pipeline.cpp.

125{
126 Image color(640, 320);
127 ZBuffer depth(color.width(), color.height());
128
129 Mesh mesh= read_mesh("data/bigguy.obj");
130 if(mesh == Mesh::error())
131 return 1;
132 printf(" %d positions\n", mesh.vertex_count());
133 printf(" %d indices\n", mesh.index_count());
134
135 // regle le point de vue de la camera pour observer l'objet
136 Point pmin, pmax;
137 mesh.bounds(pmin, pmax);
138 Orbiter camera(pmin, pmax);
139
140 BasicPipeline pipeline(
141 mesh,
142 Identity(),
143 camera.view(),
144 camera.projection(color.width(), color.height(), 45) );
145
146 Transform viewport= Viewport(color.width(), color.height());
147
148 // draw(pipeline, mesh.vertex_count());
149 for(unsigned int i= 0; i +2 < (unsigned int) mesh.vertex_count(); i= i +3)
150 {
151 // transforme les 3 sommets du triangle
152 Point a= pipeline.vertex_shader(i);
153 Point b= pipeline.vertex_shader(i+1);
154 Point c= pipeline.vertex_shader(i+2);
155
156 // visibilite
157 if(visible(a) == false && visible(b) == false && visible(c) == false)
158 continue;
159 // faux dans pas mal de cas...
160 // question : comment faire un test correct ?
161 // indication : si tous les sommets sont du meme cote d'une face de la region observee par la camera, on est sur que le triangle n'est pas visible.
162 // comment definir la region observee par la camera ? quelle est sa forme (dans quel repere) ? les coordonnees de ses sommets ?
163
164 // passage dans le repere image
165 a= viewport(a);
166 b= viewport(b);
167 c= viewport(c);
168
169 // question: comment ne pas dessiner le triangle s'il est mal oriente ?
170 // aire du triangle abc
171 float n= area(a, b, c);
172 if(n < 0)
173 continue;
174
175 // dessiner le triangle
176 // solution naive, parcours tous les pixels de l'image
177 // question : comment eviter de tester tous les pixels ?
178 // indice : il est sans doute possible de determiner que le triangle ne touche pas un bloc de pixels en ne testant que les 4 coins du bloc...
179 // question : dessiner de tout petits triangles est tres long. comment gagner du temps en determinant qu'un triangle est suffisament petit/etire pour "passer" entre les pixels ?
180 // (remarque: oui, ca arrive tout le temps...)
181 for(int y= 0; y < color.height(); y++)
182 for(int x= 0; x < color.width(); x++)
183 {
184 // fragment
185 Fragment frag;
186 frag.u= area(Point(x, y, 0), a, b); // distance c / ab
187 frag.v= area(Point(x, y, 0), b, c); // distance a / bc
188 frag.w= area(Point(x, y, 0), c, a); // distance b / ac
189
190 if(frag.u > 0 && frag.v > 0 && frag.w > 0)
191 {
192 // normalise les coordonnees barycentriques du fragment
193 frag.u= frag.u / n;
194 frag.v= frag.v / n;
195 frag.w= frag.w / n;
196
197 frag.x= x;
198 frag.y= y;
199 // interpole z
200 frag.z= frag.u * c.z + frag.v * a.z + frag.w * b.z;
201
202 // evalue la couleur du fragment du triangle
203 Color frag_color= pipeline.fragment_shader(i/3, frag);
204
205 // ztest
206 if(frag.z < depth(x, y))
207 {
208 color(x, y)= Color(frag_color, 1);
209 depth(x, y)= frag.z;
210 }
211
212 // question : pour quelle raison le ztest est-il fait apres l'execution du fragment shader ? est-ce obligatoire ?
213 // question : peut on eviter d'executer le fragment shader sur un bloc de pixels couverts par le triangle ?
214 // dans quelles conditions sait-on qu'il n'y a rien a dessiner dans un bloc de pixels ?
215 // == aucun fragment du triangle appartenant au bloc, ne peut modifier l'image et le zbuffer ?
216 }
217 }
218 }
219
220 write_image(color, "render.png");
221 return 0;
222}
representation d'une image.
Definition image.h:21
representation d'un objet / maillage.
Definition mesh.h:121
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition text.cpp:140
bool write_image(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .png
Definition image_io.cpp:245
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition mat.cpp:357
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
representation d'une couleur (rgba) transparente ou opaque.
Definition color.h:14
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21