创建VAO
/*
* glGenVertexArrays()
* 功能:生成一个顶点数组对象。
* 参数:n:指定要生成的顶点数组对象的数目。
* arrays:指定存储生成的顶点数组对象名称(ID)的数组。
*/
void glGenVertexArrays( GLsizei n,GLuint *arrays);
参考:https://blog.csdn.net/MSK1111/article/details/103114272
//举例
glGenVertexArrays(1, &VAO);
/*
* glBindVertexArray()
* 功能:将顶点数组对象与名称数组绑定。
* 参数:array:指定要绑定的顶点数组的名称。
*/
void glBindVertexArray( GLuint array);
参考:https://blog.csdn.net/MSK1111/article/details/103072687
//举例
glBindVertexArray(VAO);
/*
* glBindVertexArray()
* 功能:删除n个顶点数组对象(如删除当前绑定的顶点数组对象,则该对象的绑定将还原为零)
* 参数:n:指定要删除的顶点数组对象的数量。
* arrays:指定包含要删除的对象的n个名称的数组的地址。
*/
void glDeleteVertexArrays( GLsizei n,const GLuint *arrays);
参考:https://blog.csdn.net/MSK1111/article/details/103076975
//举例
glDeleteVertexArrays(1, &VAO);
创建VBO/EBO
/*
* glGenBuffers()
* 功能:用来生成缓冲区对象的名称。
* 参数:n:生成的缓冲对象的数量。
* buffers:输入用来存储缓冲对象名称的数组。
*/
void glGenBuffers(GLsizei n,GLuint * buffers);
参考:https://blog.csdn.net/qq_36383623/article/details/85123077
//举例
GLuint vbo;
glGenBuffers(1,&vbo);
GLuint vbo[3];
glGenBuffers(3,vbo);
/*
* glBindBuffer()
* 功能:绑定一个缓冲区对象。
* 参数:target:缓冲对象的类型。
* buffer:绑定的缓冲对象的名称。
* 注意:target类型有:
* 顶点属性数据:GL_ARRAY_BUFFER
* 索引数据:GL_ELEMENT_ARRAY_BUFFER
* 像素数据:GL_PIXEL_UNPACK_BUFFER
*/
void glBindBuffer(GLenum target,GLuint buffer);
参考:https://blog.csdn.net/qq_36383623/article/details/85123077
//举例
//VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO); //VBO变成了一个顶点缓冲类型
//EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//EBO变成了一个索引数据
/*
* glDeleteBuffers()
* 功能:删除缓冲区对象
* 参数:n:指定要删除的缓冲区对象名称的数量。
* buffers:指定要删除的缓冲区对象名称的数组。
*/
void glDeleteBuffers(GLsizei n,const GLuint * buffers);
参考:https://blog.csdn.net/flycatdeng/article/details/82666461
//举例
glDeleteBuffers(1, &vbo); //删除VBO缓冲区
传输数据
/*
* glBufferData()
* 功能:用于为缓冲对象(VBO、EBO 等)分配空间并存储数据,把用户定义的数据复制到当前绑定的换成缓冲对象中
* 参数:target:指定缓冲对象的目标(目标的缓冲类型)。
* size:指定要分配的空间大小(以字节为单位)。
* data: 指向要存储的数据的指针(实际发送的数据)。
* usage:指定缓冲对象的用途(显卡如何管理给定的数据)。
* GL_STATIC_DRAW:数据不会或几乎不会改变。
* GL_DYNAMIC_DRAW:数据会被改变很多。
* GL_STREAM_DRAW :数据每次绘制时都会改变。
*/
void glBufferData(GLenum target,
GLsizeiptr size,
const GLvoid *data,
GLenum usage);
参考:https://blog.csdn.net/flycatdeng/article/details/82664599
//举例
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//缓冲数据为顶点属性数据,数据在vertices数组中,绘制数据使用静态绘制方法(数据不会或几乎不会改变)
传输数据
/*
* glVertexAttribPointer()
* 功能:解析顶点数据信息,用于将当前的顶点属性与顶点缓冲对象(VBO)关联起来,告诉OpenGL从内存中获取数据。
* 参数:index:指定属性的索引(Shader的属性位置,位置对应的数据值)。
* size:每个顶点需要更新的分量数目(必须有1/2/3/4,比如顶点数据使用的是vec3(x,y,z)则size的值为3)。
* type: 指定数组中每个元素的数据类型(比如顶点数据使用的是float类型,则type为GL_FLOAT)。
* stride:数组中每两个元素之间的大小偏移量。
* pointer:在缓存对象中,从起始位置开始计算的额数组偏移量。
*/
void glVertexAttribPointer( GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const void * pointer);
参考:https://blog.csdn.net/aoxuestudy/article/details/122063435
//举例
float vertices[] = {
// positions
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
//设置与shader中相应的位置信息。所以index的数值为0;
//vertices为vec3(x,y,z)每个顶点数据信息包含三个参数,所以size为3;
//数据类型为float类型,所以type参数为GL_FLOAT,每组数据顶点大小是3个float类型的大小;偏移量为0。
关于着色器
/*
* glCreateShader()
* 功能:创建一个 shader 对象。
* 参数:shaderType:指定创建 shader 的类型。
* GL_VERTEX_SHADER:顶点着色器类型。
* GL_FRAGMENT_SHADER :片元着色器类型。
* GL_COMPUTE_SHADER:计算着色器…………
*/
GLuint glCreateShader(GLenum shaderType);
参考:https://blog.csdn.net/MSK1111/article/details/102914325
/*
* glShaderSource()
* 功能:创建一个 shader 对象。
* 参数:shaderType:要被替换源代码的着色器对象的句柄(ID)。
* count:指定字符串和长度数组中的元素数。
* string:指定指向包含要加载到着色器的源代码的字符串的指针数组。
* length:指定字符串长度的数组。
*/
void glShaderSource(GLuint shader,GLsizei count,const GLchar * const *string,const GLint *length);
/*
* glCompileShader()
* 功能: 编译 shader 对象。
* 参数:shader:指定要编译的 shader 对象。
*/
void glCompileShader(GLuint shader);
参考:https://blog.csdn.net/linjf520/article/details/106528133
/*
* glAttachShader()
* 功能: 将着色器对象附加到program对象。
* 参数:program:指定着色器对象将附加到的program对象。
* shader:指定要附加的着色器对象。
*/
void glAttachShader(GLuint program,GLuint shader);
参考:https://blog.csdn.net/MSK1111/article/details/102914325
/*
* glLinkProgram()
* 功能:链接一个程序对象。
* 参数:program:指定要被链接的程序。
*/
void glLinkProgram(GLuint program);
参考:https://blog.csdn.net/sinat_29255093/article/details/103297500
/*
* glUseProgram()
* 功能:将一个程序对象作为当前渲染状态的一部分。
* 参数:program:指定带有可执行对象的程序对象,用于当前渲染状态的一部分。
*/
void glUseProgram(GLuint program);
参考:https://blog.csdn.net/linjf520/article/details/106537807
//举例
//创建顶点着色器
const char* vertexShaderSource =
"#version 330 core \n"
"layout (location = 0) in vec3 aPos; \n"
"void main(){ \n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); \n"
"}"
//创建片元着色器
const char* fragmentShaderSource =
"#version 330 core \n "
"out vec4 FragColor; \n "
"void main(){ \n "
" FragColor = vec4(1.0 , 2.0 , 3.0 ,1.0 ); \n "
"}"
//定义一个顶点着色器对象并编译
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
//定义一个片元着色器对象并编译
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
//定于一个着色器程序对象
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
//将顶点着色器、片元着色器加入至着色器程序中
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);//链接着色器程序
//使用着色器程序对象
glUseProgram(shaderProgram);
绘制
/*
* glDrawArrays()
* 功能: 提供绘制功能,从数组数据中提取数据渲染基本图元。(VBO)
* 参数:mode:需要渲染的图元类型。
* GL_POINTS:点
* GL_LINES:线
* GL_TRIANGLES:三角形
* first:从数组缓存中的哪一位开始绘制,一般为0。
* count: 数组中顶点的数量。
*/
void glDrawArrays( GLenum mode, GLint first, GLsizei count);
//举例
glDrawArrays(GL_TRIANGLES, 0, 3);
参考:https://blog.csdn.net/frank06504/article/details/117523329
/*
* glDrawElements()
* 功能: 提供绘制功能,从数组数据中提取数据渲染基本图元。(EBO)
* 注意:采用了EBO时,需要用glDrawElements函数来代替glDrawArrays函数,来指明我们从索引缓冲渲染
* 参数:mode:需要渲染的图元类型。
* GL_POINTS:点
* GL_LINES:线
* GL_TRIANGLES:三角形
* count:数组中顶点的数量。
* type: 索引的类型(GL_UNSIGNED_BYTE/INT/SHORT)。
* indices:指向索引数组的指针。
*/
void glDrawElements(GLenum mode, GLsizei count,GLenum type, const GLvoid *indices);
//举例
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
参考:https://blog.csdn.net/birdflyto206/article/details/51191880
纹理
/*
* glGenTextures()
* 功能: 根据纹理参数返回n个纹理索引。
* 参数:n:需要生成纹理的数量。
* textures:存储纹理索引。
*/
void glGenTextures(GLsizei n, GLuint *textures)
参考:https://blog.csdn.net/qq_22642239/article/details/118695370
/*
* glBindTexture()
* 功能: 将生成的纹理的名字绑定到对应的目标纹理上。
* 参数:target:纹理被绑定的目标(GL_TEXTURE_1D/GL_TEXTURE_2D)。
* texture:纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。
*/
void glBindTexture(GLenum target, GLuint texture);
参考:https://blog.csdn.net/yf0811240333/article/details/43524791/
/*
* glActiveTexture()
* 功能: 激活该一个纹理单元, 接下来的纹理函数将修改该纹理单元。
* 参数:texUnit:为符号常量GL_TEXTUREi,其中i的取值范围为0到k-1(k是OpenGL支持的最大纹理单元数)。
*/
void glActiveTexture(GLenum texUnit);
参考:https://www.iteye.com/blog/y150988451-813080
/*
* glTexImage2D()
* 功能: 定义一个二维纹理映射。
* 参数:target:常数GL_TEXTURE_2D。
* level:表示多级分辨率的纹理图像的级数。
* components:颜色成分3则为RGB三部分,若为4则是RGB+Alpha
* width:纹理的宽度
* height:纹理的高度
* border:纹理边框的值(它通常为0)
* format:描述了纹理映射的格式
* type:数据类型
* data:纹理数据的来源
*/
void glTexImage2D(GLenum target , GLint , GLint components,
GLsizei width , GLsizei height , GLint border,
GLenum format , GLenum type, const GLvoid * data);
参考:https://blog.csdn.net/heibaigezi/article/details/90519156
/*
* glGenerateMipmap()
* 功能: 为纹理对象生成一组完整的mipmap。
* 参数:target:指定将生成mipmap的纹理对象绑定到的活动纹理单元的纹理目标。
* ( GL_TEXTURE_2D或GL_TEXTURE_CUBE_MAP )
*/
void glGenerateMipmap(GLenum target);
参考:https://blog.csdn.net/MSK1111/article/details/102895216
//举例
//生成纹理
unsigned int texture;
glGenTextures(1, &texture); //生成一个纹理对象
glBindTexture(GL_TEXTURE_2D, texture); //将纹理对象进行绑定,绑定的目标为2D图片
//加载并生成纹理
int width, height, nrChannels;
const char* filepath = "texture_1.jpg";
stbi_set_flip_vertically_on_load(true);
//使用stbi_load加载图片,解析图片信息
unsigned char* data = stbi_load(filepath, &width, &height, &nrChannels, 0);
printf("width=%d,height=%d,nrChannel=%d\n", width, height, nrChannels);
if (data) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else {
printf("Failed to load texture");
}
//加载完纹理后需要释放图片
stbi_image_free(data);
glActiveTexture(GL_TEXTURE0);//激活并使用纹理0