a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
28 {
29
32 return -1;
33
34 Point pmin, pmax;
36 m_camera.lookat(pmin - Vector(40, 40, 40), pmax + Vector(40, 40, 40));
37
39
40
41 glGenVertexArrays(1, &m_vao);
42 glBindVertexArray(m_vao);
43
44
45 glGenBuffers(1, &m_buffer);
46 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
47
49 glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
50
51
52 size_t offset_positions= 0;
54 glBufferSubData(GL_ARRAY_BUFFER, offset_positions, size, mesh.
vertex_buffer());
55
56 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset_positions);
57 glEnableVertexAttribArray(0);
58
59
60 size_t offset_normals= offset_positions + size;
62 glBufferSubData(GL_ARRAY_BUFFER, offset_normals, size, mesh.
normal_buffer());
63
64 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset_normals);
65 glEnableVertexAttribArray(2);
66
67
68
69
70 srand(time(nullptr));
71
72 for(int i= 0; i < 1024*1024; i++)
73 {
74 float x= rand() % 256 - 128;
75 float y= rand() % 256 - 128;
76 float z= rand() % 256 - 128;
77
78 m_positions.push_back(vec3(x *4, y *4, z *4));
79 }
80
81
82 m_instance_count= int(m_positions.size());
83
84 printf(
"buffer %dKB\n",
int(
sizeof(vec3) * m_positions.size() / 1024));
85
86
87
88 glGenBuffers(1, &m_instance_buffer);
89 glBindBuffer(GL_ARRAY_BUFFER, m_instance_buffer);
90 glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * m_positions.size(), m_positions.data(), GL_DYNAMIC_DRAW);
91
92
93
94 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
95 glVertexAttribDivisor(1, 1);
96 glEnableVertexAttribArray(1);
97
98
99 glGenBuffers(1, &m_instance_storage);
100 glBindBuffer(GL_ARRAY_BUFFER, m_instance_storage);
101 glBufferStorage(GL_ARRAY_BUFFER, sizeof(vec3) * m_positions.size(), nullptr, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
102
103 m_storage= glMapBufferRange(GL_ARRAY_BUFFER, 0, sizeof(vec3) * m_positions.size(),
104 GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT);
105 if(m_storage == nullptr)
106 return -1;
107
108
109 glGenVertexArrays(1, &m_vao_storage);
110 glBindVertexArray(m_vao_storage);
111
112 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
113 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset_positions);
114 glEnableVertexAttribArray(0);
115 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) offset_normals);
116 glEnableVertexAttribArray(2);
117
118 glBindBuffer(GL_ARRAY_BUFFER, m_instance_storage);
119 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
120 glVertexAttribDivisor(1, 1);
121 glEnableVertexAttribArray(1);
122
123 glBindVertexArray(0);
124
125
127 glBindVertexArray(0);
128 glBindBuffer(GL_ARRAY_BUFFER, 0);
129
130
131 m_program=
read_program(
"gkit2_tutos/instance_buffer.glsl");
133
134
135 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
136
137 glClearDepth(1.f);
138 glDepthFunc(GL_LESS);
139 glEnable(GL_DEPTH_TEST);
140
141 return 0;
142 }
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().