glsl shader (一) buffer 的使用 文理的使用

 创建缓冲流程:

1.申请缓冲id glgenBuffers

2.将数据写入buffer glbufferdata

2.申请vertexArrayid glgenVertexArrays

3.设置顶点位置绘制起点 glvertexattributepointer glenablevertexattribarray(0)

4 设置顶点颜色绘制起点 glvertexattribtepointer glenablevertexattribarray(1)

5.设置文理坐标起点

 

6.绘制的时候,在display方法中调用drawArray函数

void testBuffer() {

	GLfloat vertPos[] = {
		-0.5,0,0,
		0.5,0,0,
		0,0.5,0
	};

	GLfloat vertColor[] = {
		1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,   // 颜色
	};

	GLfloat vertices[] = {
		-0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f,  // 顶点位置
		1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,   // 颜色
		0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f     // 纹理坐标
	};

	// 创建缓存对象
	GLuint VOId;
	// Step1: 创建并绑定VAO对象
	glGenVertexArrays(1, &VOId);
	glBindVertexArray(VOId);

	GLuint VBOId;
	glGenBuffers(1, &VBOId);
	glBindBuffer(GL_ARRAY_BUFFER, VBOId);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	// 顶点位置属性
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); // 紧密排列 stride也可以设置为 3 * sizeof(GL_FLOAT)
	glEnableVertexAttribArray(0);

	// 顶点颜色属性
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(9 * sizeof(GLfloat)));
	//glEnableVertexAttribArray(1);

	// 顶点纹理坐标
	glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(18 * sizeof(GLfloat)));
	//glEnableVertexAttribArray(2);
	//glBindBuffer(GL_ARRAY_BUFFER, 0);
	//glBindVertexArray(0);
	glBindBuffer(GL_ARRAY_BUFFER, VBOId);
	glBindVertexArray(VOId);


}

每一个文理只能在一个文理单元中设置

gluniform1i(location , v0)

该方法中,location为文理贴图在shader中的名字

vo为文理单元的编号,而不是文理贴图的id

参考网址 https://blog.csdn.net/linuxheik/article/details/78906568

 

你可能感兴趣的:(c++,glsl,opengl)