OpenGL VBO、VAO、EBO简单例子

OpenGL VBO、VAO、EBO简单例子

LiChengwei47

于 2021-11-05 20:18:03 发布

251
收藏 2
分类专栏: OpenGL 文章标签: c++ opengl opengles
版权

OpenGL
专栏收录该内容
6 篇文章1 订阅
订阅专栏
文章目录
VBO使用glDrawArrays()函数画梯形
在上一个例子的基础上改变背景颜色
VBO+VAO使用glDrawArrays()函数画梯形
VBO+VAO+片段着色器给梯形着色
EBO+VBO+VAO画两个三角形

My Github Link
写再最开头:learnOpengl网站用的gflw3和glad两个库,由于我自己配置的环境是glut+glew两个库,所以我把那些例子改为了能在glut+glew两个库下运行的代码。
顶点数组对象:Vertex Array Object,VAO
顶点缓冲对象:Vertex Buffer Object,VBO
索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO

参考:
https://blog.csdn.net/dcrmg/article/details/53556664
learnOpenGL网站实例代码
learnOpenGLl中文网站(个人认为最适合新手的教程)

VBO使用glDrawArrays()函数画梯形
#include <stdlib.h>
#include<iostream>
#include<GL/glew.h>
#include<GL/glut.h>
void userInit(); //自定义初始化
void display(void);

GLuint vboId;//vertex buffer object句柄
GLuint vaoId;//vertext array object句柄
GLuint programId;//shader program 句柄
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("Rectangle demo");

//使用glew,需要执行glewInit,不然运行过程会报错
//glewInit要放在glut完成了基本的初始化之后执行
glewInit();

//自定义初始化,生成VAO,VBO对象
userInit();


glutDisplayFunc(display);

glutMainLoop();
return 0;
}

void userInit()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
//创建顶点数据
const GLfloat vertices[] = {
-0.5f,-0.5f,0.0f,1.0f,
0.5f,-0.5f,0.0f,1.0f,
0.25f,0.5f,0.0f,1.0f,
-0.25f,0.5f,0.0f,1.0f,
};


//创建VBO对象
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
//传入VBO数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//解除VBO绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

//绘制回调函数
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

//绑定VBO
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glEnableVertexAttribArray(0);

//解释顶点数据方式
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

//绘制模型
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(0);

glutSwapBuffers();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
result:


在上一个例子的基础上改变背景颜色
数据类型由RGBA改为RGB

void userInit(); //自定义初始化
void display(void);

GLuint vboId;//vertex buffer object句柄
GLuint vaoId;//vertext array object句柄
GLuint programId;//shader program 句柄
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("Rectangle demo");

//使用glew,需要执行glewInit,不然运行过程会报错
//glewInit要放在glut完成了基本的初始化之后执行
glewInit();

//自定义初始化,生成VAO,VBO对象
userInit();


glutDisplayFunc(display);

glutMainLoop();
return 0;
}

void userInit()
{
glClearColor(1.0f, 0.3f, 0.3f, 1.0f);//背景颜色
//创建顶点数据
const GLfloat vertices[] = {
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.25f,0.5f,0.0f,
-0.25f,0.5f,0.0f
};


//创建VBO对象
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
//传入VBO数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//解除VBO绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

//绘制回调函数
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

//绑定VBO
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glEnableVertexAttribArray(0);

//解释顶点数据方式
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);

//绘制模型
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(0);

glutSwapBuffers();
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
result:


VBO+VAO使用glDrawArrays()函数画梯形
VAO与VBO的关系,VAO利用VBO加载数据


#include <stdlib.h>
#include<iostream>
#include<GL/glew.h>
#include<GL/glut.h>

void userInit(); //自定义初始化
void display(void);

GLuint VAO;
GLuint VBO;
unsigned int fragmentShader;
unsigned int vertexShader;
unsigned int shaderProgram;
const GLfloat vertices[] = {
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.25f,0.5f,0.0f,
-0.25f,0.5f,0.0f,
};

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("Rectangle demo");

//使用glew,需要执行glewInit,不然运行过程会报错
//glewInit要放在glut完成了基本的初始化之后执行
glewInit();

//自定义初始化,生成VAO,VBO对象
userInit();


glutDisplayFunc(display);

glutMainLoop();
glDeleteVertexArrays(1, &VAO);
glDeleteProgram(shaderProgram);
return 0;
}

void userInit()
{
glClearColor(1.0f, 0.3f, 0.3f, 1.0f);//背景颜色
//创建VAO对象
glGenVertexArrays(1, &VAO);
//VAO绑定
glBindVertexArray(VAO);
//创建VBO对象
glGenBuffers(1, &VBO);
//VBO绑定
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//给VBO传入数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//解绑VAO
glBindVertexArray(0);
//解绑VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

//绘制回调函数
void display(void)
{

//绑定VA0
glBindVertexArray(VAO);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAO); // 这里仅仅绑定了VAO,无需再绑定VBO
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindVertexArray(0);
glutSwapBuffers();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
result:


VBO+VAO+片段着色器给梯形着色
#include <stdlib.h>
#include<iostream>
#include<GL/glew.h>
#include<GL/glut.h>

void userInit(); //自定义初始化
void display(void);

GLuint VAO;
GLuint VBO;
unsigned int fragmentShader;
unsigned int vertexShader;
unsigned int shaderProgram;
const GLfloat vertices[] = {
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.25f,0.5f,0.0f,
-0.25f,0.5f,0.0f,
};
const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
"}\0";
const GLchar* fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("Rectangle demo");

//使用glew,需要执行glewInit,不然运行过程会报错
//glewInit要放在glut完成了基本的初始化之后执行
glewInit();

//自定义初始化,生成VAO,VBO对象
userInit();


glutDisplayFunc(display);

glutMainLoop();
glDeleteVertexArrays(1, &VAO);
glDeleteProgram(shaderProgram);
return 0;
}

void userInit()
{
//glClearColor(1.0f, 0.3f, 0.3f, 1.0f);//背景颜色
//创建VAO对象
glGenVertexArrays(1, &VAO);
//VAO绑定
glBindVertexArray(VAO);
//创建VBO对象
glGenBuffers(1, &VBO);
//VBO绑定
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//给VBO传入数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//解绑VAO
glBindVertexArray(0);
//解绑VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);

vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// check for shader compile errors
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}
// 片段着色器给三角形着色
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// check for shader compile errors
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}
// link shaders
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// check for linking errors
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}

//绘制回调函数
void display(void)
{

//绑定VA0
glBindVertexArray(VAO);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glBindVertexArray(VAO); // 这里仅仅绑定了VAO,无需再绑定VBO

glUseProgram(shaderProgram);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

glBindVertexArray(0);
glutSwapBuffers();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
result:


EBO+VBO+VAO画两个三角形
可以按照上一个例子给三角形着色

#include <stdlib.h>
#include<iostream>
#include<GL/glew.h>
#include<GL/glut.h>
void userInit(); //自定义初始化
void display(void);

GLuint VAO;
GLuint VBO;
GLuint EBO;
GLuint programId;
float vertices[] = {
-1.0f, -0.5f, 0.0f,
0.f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,

1.0f,-0.5f,0.0f,
0.5f,0.5f,0.0f
};

unsigned int indices[] = { // 注意索引从0开始!
0, 1, 2, // 第一个三角形
1, 3, 4 // 第二个三角形
};
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("Rectangle demo");

//使用glew,需要执行glewInit,不然运行过程会报错
//glewInit要放在glut完成了基本的初始化之后执行
glewInit();

//自定义初始化,生成VAO,VBO对象
userInit();


glutDisplayFunc(display);

glutMainLoop();
return 0;
}

void userInit()
{

glGenBuffers(1, &EBO);//创建EBO
glGenVertexArrays(1, &VAO);//创建VAO
glGenBuffers(1, &VBO);//创建VBO
glBindVertexArray(VAO);//绑定VAO
glBindBuffer(GL_ARRAY_BUFFER, VBO);//绑定VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//绑定EBO
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//这里缓冲定义和之前不一样
//解释顶点数据方式
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//解除VAO绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}

//绘制回调函数
void display(void)
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

//绑定VAO
glBindVertexArray(VAO);


//绘制模型
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glBindVertexArray(0);
glDisableVertexAttribArray(0);

glutSwapBuffers();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
result:

————————————————
版权声明:本文为CSDN博主「LiChengwei47」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/it_LiChengwei/article/details/121169716

posted on   zxddesk  阅读(187)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示