@@ -130,21 +130,49 @@ int main ()
130
130
0 .0f , 0 .5f , 0 .0f
131
131
};
132
132
133
+ // 绘制4边形,采用索引缓冲(EBO/IBO)
134
+ float vertices1[] = {
135
+ 0 .5f , 0 .5f , 0 .0f , // 右上角
136
+ 0 .5f , -0 .5f , 0 .0f , // 右下角
137
+ -0 .5f , -0 .5f , 0 .0f , // 左下角
138
+ -0 .5f , 0 .5f , 0 .0f // 左上角
139
+ };
140
+
141
+ unsigned int indices[] = { // 注意索引从0开始!
142
+ 0 , 1 , 3 , // 第一个三角形
143
+ 1 , 2 , 3 // 第二个三角形
144
+ };
145
+
133
146
// 创建缓冲对象对象
134
- GLuint VBO ;
135
- glGenBuffers (1 , &VBO );
147
+ GLuint VBOs[ 2 ] ;
148
+ glGenBuffers (2 , VBOs );
136
149
137
- // 创建顶点数组
138
- GLuint VAO;
139
- glGenVertexArrays (1 , &VAO);
140
- glBindVertexArray (VAO);
150
+ // 创建索引缓冲
151
+ GLuint EBO;
152
+ glGenBuffers (1 , &EBO);
141
153
154
+ // 创建顶点数组
155
+ GLuint VAOs[2 ];
156
+ glGenVertexArrays (2 , VAOs);
157
+
158
+ // 绘制三角形
159
+ glBindVertexArray (VAOs[0 ]);
142
160
// 把缓冲对象绑定到 GL_ARRAY_BUFFER
143
- glBindBuffer (GL_ARRAY_BUFFER, VBO);
144
-
161
+ glBindBuffer (GL_ARRAY_BUFFER, VBOs[0 ]);
145
162
// 将数据复制到指定目标的缓冲区中
146
163
glBufferData (GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW);
164
+ // 设置openGL如何解析顶点数据
165
+ glVertexAttribPointer (0 , 3 , GL_FLOAT, GL_FALSE, 3 * sizeof (float ), (void *)0 );
166
+ // 启用顶点属性
167
+ glEnableVertexAttribArray (0 );
147
168
169
+ // 绘制四边形
170
+ glBindVertexArray (VAOs[1 ]);
171
+ glBindBuffer (GL_ARRAY_BUFFER, VBOs[1 ]);
172
+ glBufferData (GL_ARRAY_BUFFER, sizeof (vertices1), vertices1, GL_STATIC_DRAW);
173
+ // 把缓冲对象绑定到 GL_ELEMENT_ARRAY_BUFFER
174
+ glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, EBO);
175
+ glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices, GL_STATIC_DRAW);
148
176
// 设置openGL如何解析顶点数据
149
177
glVertexAttribPointer (0 , 3 , GL_FLOAT, GL_FALSE, 3 * sizeof (float ), (void *)0 );
150
178
// 启用顶点属性
@@ -153,6 +181,9 @@ int main ()
153
181
glBindBuffer (GL_ARRAY_BUFFER, 0 );
154
182
glBindVertexArray (0 );
155
183
184
+ // 确定渲染三角形或者四边形
185
+ int flag = 0 ;
186
+
156
187
// 渲染循环
157
188
while (!glfwWindowShouldClose (window))
158
189
{
@@ -163,17 +194,29 @@ int main ()
163
194
// 清空屏幕颜色缓冲
164
195
glClear (GL_COLOR_BUFFER_BIT);
165
196
166
- glBindVertexArray (VAO);
167
- glDrawArrays (GL_TRIANGLES, 0 , 3 );
197
+ flag++;
198
+ if (flag < 100 ) {
199
+ glBindVertexArray (VAOs[0 ]);
200
+ glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
201
+ glDrawArrays (GL_TRIANGLES, 0 , 3 );
202
+ } else {
203
+ if (flag == 200 ) {
204
+ flag = 0 ;
205
+ }
206
+
207
+ glBindVertexArray (VAOs[1 ]);
208
+ glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
209
+ glDrawElements (GL_TRIANGLES, 6 , GL_UNSIGNED_INT, 0 );
210
+ }
168
211
169
212
// 交换颜色缓冲
170
213
glfwSwapBuffers (window);
171
214
// 检查触发事件(键盘输入、鼠标点击、窗口大小改变等),并调用对应的回调函数
172
215
glfwPollEvents ();
173
216
}
174
217
175
- glDeleteVertexArrays (1 , &VAO );
176
- glDeleteBuffers (1 , &VBO );
218
+ glDeleteVertexArrays (2 , VAOs );
219
+ glDeleteBuffers (2 , VBOs );
177
220
178
221
glfwTerminate ();
179
222
return 0 ;
0 commit comments