Skip to content

Commit 0a52286

Browse files
committed
demo: 补充四边形
1 parent 2eb33cf commit 0a52286

File tree

2 files changed

+56
-13
lines changed

2 files changed

+56
-13
lines changed

1.2-hello-triangle/src/main.cpp

+55-12
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,49 @@ int main ()
130130
0.0f, 0.5f, 0.0f
131131
};
132132

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+
133146
// 创建缓冲对象对象
134-
GLuint VBO;
135-
glGenBuffers(1, &VBO);
147+
GLuint VBOs[2];
148+
glGenBuffers(2, VBOs);
136149

137-
// 创建顶点数组
138-
GLuint VAO;
139-
glGenVertexArrays(1, &VAO);
140-
glBindVertexArray(VAO);
150+
// 创建索引缓冲
151+
GLuint EBO;
152+
glGenBuffers(1, &EBO);
141153

154+
// 创建顶点数组
155+
GLuint VAOs[2];
156+
glGenVertexArrays(2, VAOs);
157+
158+
// 绘制三角形
159+
glBindVertexArray(VAOs[0]);
142160
// 把缓冲对象绑定到 GL_ARRAY_BUFFER
143-
glBindBuffer(GL_ARRAY_BUFFER, VBO);
144-
161+
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
145162
// 将数据复制到指定目标的缓冲区中
146163
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);
147168

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);
148176
// 设置openGL如何解析顶点数据
149177
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
150178
// 启用顶点属性
@@ -153,6 +181,9 @@ int main ()
153181
glBindBuffer(GL_ARRAY_BUFFER, 0);
154182
glBindVertexArray(0);
155183

184+
// 确定渲染三角形或者四边形
185+
int flag = 0;
186+
156187
// 渲染循环
157188
while (!glfwWindowShouldClose(window))
158189
{
@@ -163,17 +194,29 @@ int main ()
163194
// 清空屏幕颜色缓冲
164195
glClear(GL_COLOR_BUFFER_BIT);
165196

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+
}
168211

169212
// 交换颜色缓冲
170213
glfwSwapBuffers(window);
171214
// 检查触发事件(键盘输入、鼠标点击、窗口大小改变等),并调用对应的回调函数
172215
glfwPollEvents();
173216
}
174217

175-
glDeleteVertexArrays(1, &VAO);
176-
glDeleteBuffers(1, &VBO);
218+
glDeleteVertexArrays(2, VAOs);
219+
glDeleteBuffers(2, VBOs);
177220

178221
glfwTerminate();
179222
return 0;

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ vscode: 1.41.1
2323
--------------------|------------------|
2424
temp-demo |模版demo,提供开发环境|
2525
1.1-hello-window |窗口显示、清除颜色缓冲区|
26-
1.2-hello-triangle |绘制三角形:VAO、VBO|
26+
1.2-hello-triangle |绘制三角形:VAO、VBO、EBO(IBO)|

0 commit comments

Comments
 (0)