gKit2 light
Loading...
Searching...
No Matches
alpha.cpp
1
2// "hashed alpha testing" https://casual-effects.com/research/Wyman2017Hashed/
3
4// \todo utiliser la quantification du bruit pour le stabiliser...
5
6// \todo comparer avec "Weighted Blended Order-Independent Transparency" http://jcgt.org/published/0002/02/09/
7
8
9#include "wavefront.h"
10
11#include "draw.h"
12#include "program.h"
13#include "texture.h"
14#include "uniforms.h"
15#include "app_camera.h"
16
17
18// utilitaire. creation d'une grille / repere.
19Mesh make_grid( const int n= 10 )
20{
21 Mesh grid= Mesh(GL_LINES);
22
23 // grille
24 grid.color(White());
25 float w= float(n-1) / 2;
26 for(int x= 0; x < n; x++)
27 {
28 grid.vertex(x -w, 0, -w);
29 grid.vertex(x -w, 0, w);
30 }
31
32 for(int z= 0; z < n; z++)
33 {
34 grid.vertex(-w, 0, z -w);
35 grid.vertex( w, 0, z -w);
36 }
37
38 // axes XYZ
39 grid.color(Red());
40 grid.vertex(Point(0, .1, 0));
41 grid.vertex(Point(1, .1, 0));
42
43 grid.color(Green());
44 grid.vertex(Point(0, .1, 0));
45 grid.vertex(Point(0, 1, 0));
46
47 grid.color(Blue());
48 grid.vertex(Point(0, .1, 0));
49 grid.vertex(Point(0, .1, 1));
50
51 glLineWidth(2);
52
53 return grid;
54}
55
56
57class TP : public AppCamera
58{
59public:
60 // constructeur : donner les dimensions de l'image, version openGL + nombres de samples MSAA (ou 1)
61 TP( const int msaa= 1 ) : AppCamera(1024, 640, 4,3, msaa) {}
62
63 // creation des objets de l'application
64 int init( )
65 {
66 // decrire un repere / grille
67 m_repere= make_grid(20);
68
69 Point grid_pmin, grid_pmax;
70 m_repere.bounds(grid_pmin, grid_pmax);
71
72 //~ m_objet= read_mesh("data/alpha.obj"); // utiliser alpha.glsl !!
73 m_objet= read_mesh("data/robot.obj"); // utiliser alpha_notexture.glsl !!
74
75 Point pmin, pmax;
76 m_objet.bounds(pmin, pmax);
77
78 pmin= min(pmin, grid_pmin);
79 pmax= max(pmax, grid_pmax);
80
81 // parametrer la camera de l'application, renvoyee par la fonction camera()
82 camera().lookat(pmin, pmax);
83
84 // charge les textures, si necessaire
85 Materials& materials= m_objet.materials();
86 m_textures.resize(materials.filename_count());
87 for(unsigned i= 0; i < m_textures.size(); i++)
88 m_textures[i]= read_texture(0, materials.filename(i));
89
90 // affiche les matieres
91 {
92 for(int i= 0; i < materials.count(); i++)
93 {
94 const Material& material= materials.material(i);
95 printf("material[%d] '%s' kd %f %f %f ", i, materials.name(i), material.diffuse.r, material.diffuse.g, material.diffuse.b);
96 if(material.diffuse_texture != -1)
97 printf("texture '%s'", materials.filename(material.diffuse_texture));
98 printf("\n");
99 }
100 }
101
102 m_groups= m_objet.groups();
103 m_vao= m_objet.create_buffers( USE_POSITION | USE_TEXCOORD | USE_NORMAL );
104
105 //
106 //~ m_program= read_program("gkit2_tutos/alpha.glsl");
107 m_program= read_program("gkit2_tutos/alpha_notexture.glsl");
108 program_print_errors(m_program);
109
110 // etat openGL par defaut
111 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
112
113 glClearDepth(1.f); // profondeur par defaut
114 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
115 glEnable(GL_DEPTH_TEST); // activer le ztest
116
117 glEnable(GL_MULTISAMPLE); // MSAA
118 glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); // transformer la transparence en visibilite des samples MSAA
119
120 return 0; // ras, pas d'erreur
121 }
122
123 // destruction des objets de l'application
124 int quit( )
125 {
126 m_objet.release();
127 m_repere.release();
128 return 0;
129 }
130
131 // dessiner une nouvelle image
132 int render( )
133 {
134 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
135
136 // dessine aussi le repere, pour le meme point de vue
137 draw(m_repere, Identity(), camera());
138
139 if(key_state('r'))
140 {
141 // recharge le shader a la volee...
142 clear_key_state('r');
143 //~ reload_program(m_program, "gkit2_tutos/alpha.glsl");
144 reload_program(m_program, "gkit2_tutos/alpha_notexture.glsl");
145 program_print_errors(m_program);
146 }
147
148 glBindVertexArray(m_vao);
149 glUseProgram(m_program);
150
151 Transform model= Identity();
152 Transform view= camera().view();
153 Transform projection= camera().projection();
154 Transform mv= view * model;
155 Transform mvp= projection * mv;
156
157 program_uniform(m_program, "mvMatrix", mv);
158 program_uniform(m_program, "mvpMatrix", mvp);
159
160 // dessine tous les groupes de triangles, tries par matiere
161 const Materials& materials= m_objet.materials();
162 for(unsigned i= 0; i < m_groups.size(); i++)
163 {
164 const Material& material= materials.material(m_groups[i].material_index);
165 if(material.diffuse_texture != -1)
166 program_use_texture(m_program, "alpha", 0, m_textures[material.diffuse_texture]);
167 else
168 program_use_texture(m_program, "alpha", 0, 0);
169
170 //~ printf("group[%u] material %d first %d n %d, texture %d\n", i, m_groups[i].material_index, m_groups[i].first, m_groups[i].n, material.diffuse_texture);
171
172 glDrawArrays(GL_TRIANGLES, m_groups[i].first, m_groups[i].n);
173 }
174
175 if(key_state('s'))
176 {
177 clear_key_state('s');
178 static int id= 1;
179 screenshot("alpha", id++);
180 }
181
182 // continuer...
183 return 1;
184 }
185
186protected:
187 Mesh m_objet;
188 Mesh m_repere;
189 GLuint m_vao;
190 GLuint m_program;
191 std::vector<GLuint> m_textures;
192 std::vector<TriangleGroup> m_groups;
193};
194
195
196int main( int argc, char **argv )
197{
198 // il ne reste plus qu'a creer un objet application et la lancer
199 TP tp(8);
200 //~ TP tp(1);
201 tp.run();
202
203 return 0;
204}
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition app_camera.h:37
AppCamera(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5
representation d'un objet / maillage.
Definition mesh.h:121
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
Definition mesh.cpp:97
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition mesh.cpp:66
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition orbiter.cpp:7
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
Definition alpha.cpp:58
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Definition alpha.cpp:132
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition alpha.cpp:124
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition alpha.cpp:64
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:46
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
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition window.cpp:40
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28
Color Blue()
utilitaire. renvoie une couleur bleue.
Definition color.cpp:38
Color Green()
utilitaire. renvoie une couleur verte.
Definition color.cpp:33
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point { max(a.x, b.x), max(a.y, b.y), max(a....
Definition vec.cpp:35
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
Point min(const Point &a, const Point &b)
renvoie la plus petite composante de chaque point { min(a.x, b.x), min(a.y, b.y), min(a....
Definition vec.cpp:30
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
@ USE_POSITION
inclut l'attribut position dans les buffers.
Definition mesh.h:112
@ USE_TEXCOORD
inclut l'attribut coordonnees de texture dans les buffers.
Definition mesh.h:113
@ USE_NORMAL
inclut l'attribut normale dans les buffers.
Definition mesh.h:114
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition texture.cpp:178
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:218
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition program.cpp:446
void program_use_texture(const GLuint program, const char *uniform, const int unit, const GLuint texture, const GLuint sampler)
configure le pipeline et le shader program pour utiliser une texture, et des parametres de filtrage,...
Definition uniforms.cpp:198
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
int diffuse_texture
indice de la texture de la couleur de base, ou -1.
Definition materials.h:21
Color diffuse
couleur diffuse / de base.
Definition materials.h:17
int filename_count() const
renvoie le nombre de noms de fichiers de textures.
Definition materials.h:147
const char * filename(const int id) const
renvoie le nom de fichier d'une texture.
Definition materials.h:149
int count() const
nombre de matieres.
Definition materials.h:102
std::vector< Material > materials
description des matieres.
Definition materials.h:47
const Material & material(const int id) const
renvoie la ieme matiere.
Definition materials.h:110
const char * name(const int id) const
renvoie le nom de la ieme matiere.
Definition materials.h:105
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