创建纹理缓冲
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glGenTextures第一个参数是生成纹理的数量
glBindTexture第一个参数指定纹理的类型是2维的
配置纹理
glTexParameteri指定纹理的环绕方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
第一个参数是配置的纹理类型,
第二个参数是纹理的坐标轴(可以对三个轴str分别配置)
第三个参数是纹理环绕方式
glTexParameteri指定纹理放大缩小时插值方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
线性插值或者最临近插值。
glTexParameteri指定多级渐远纹理过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
获取图片
int width, height, nrChannels;
unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
第一个参数是纹理的目标只生成类型为2D的纹理。
第二个参数是多级渐远纹理
第三个参数是指定纹理图片为RGB
第四个参数是纹理宽度
第五个参数是纹理高度
第六个参数总是0
第七个参数是加载数据的方式为RGB
第八个参数是单个像素的大小
第九个参数是图片数据
下面这个函数生成多级渐远纹理:
glGenerateMipmap(GL_TEXTURE_2D);
数据传递
需要把数据传递给着色器,着色器再调用openGL的画树画图。
绑定纹理,着色器有16个纹理单元。从GL_TEXTURE0到GL_TEXTRUE15。使用前需要激活。
glActiveTexture(GL_TEXTURE0);
将生成的纹理和纹理单元绑定,使得着色器能够使用。
glBindTexture(GL_TEXTURE_2D, texture1);
然后激活下一个,再绑定。
在着色器中声明两个纹理:
uniform sampler2D texture1;
uniform sampler2D texture2;
然后将uniform进行赋值。之前的操作是:
指定着色器,找到着色器中uniform的位置,然后赋值。
将着色器写成一个类以后直接使用:
ourShader.use(); // 不要忘记在设置uniform变量之前激活着色器程序!
glUniform1i(glGetUniformLocation(ourShader.ID, "texture1"), 0); // 手动设置
ourShader.setInt("texture2", 1); // 或者使用着色器类设置
就行。