【OpenGL】基本API的详解及参考

创建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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值