Opengl备忘4---Texture

(1)纹理坐标:

使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0,0)也就是纹理图片的左下角,终结于纹理图片的右上角(1,1)。

Opengl备忘4---Texture_第1张图片


GLfloat texCoords[] = { 0.0f, 0.0f, // 左下角  

1.0f, 0.0f, // 右下角  

0.5f, 1.0f // 顶部位置

};


2:

纹理环绕方式(Texture Wrapping)

环绕方式 描述
GL_REPEAT 纹理的默认行为,重复纹理图像
GL_MIRRORED_REPEAT GL_REPEAT一样,除了重复的图片是镜像放置的
GL_CLAMP_TO_EDGE 纹理坐标会在0到1之间,超出的部分会重复纹理坐标的边缘,就是边缘被拉伸
GL_CLAMP_TO_BORDER 超出的部分是用户指定的边缘的颜色
  1. Opengl备忘4---Texture_第2张图片

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);


如果我们选择GL_CLAMP_TO_BORDER选项,我们还要指定一个边缘的颜色。这次使用glTexParameter函数的fv后缀形式,加上GL_TEXTURE_BORDER_COLOR作为选项,这个函数需要我们传递一个边缘颜色的float数GL_NEARESTGL_LINEAR组作为颜色值:

float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3

纹理过滤(Texture Filtering)

GL_NEAREST GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

4;

多级渐远纹理(Mipmaps)

glGenerateMipmaps

过滤方式 描述
GL_NEAREST_MIPMAP_NEAREST 接收最近的多级渐远纹理来匹配像素大小,并使用最临近插值进行纹理采样
GL_LINEAR_MIPMAP_NEAREST 接收最近的多级渐远纹理级别,并使用线性插值采样
GL_NEAREST_MIPMAP_LINEAR 在两个多级渐远纹理之间进行线性插值,通过最邻近插值采样
GL_LINEAR_MIPMAP_LINEAR 在两个相邻的多级渐远纹理进行线性插值,并通过线性插值进行采样

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

常见的错误是,为多级渐远纹理过滤选项设置放大过滤。这样没有任何效果,因为多级渐远纹理主要使用在纹理被缩小的情况下的:纹理放大不会使用多级渐远纹理,为多级渐远纹理设置放大过滤选项会产生一个GL_INVALID_ENUM错误。


5:

GLuint texture;

glGenTextures(1, &texture);

glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);

glGenerateMipmap(GL_TEXTURE_2D);

  • 第一个参数指定纹理目标(环境);设置为GL_TEXTURE_2D意味着会生成与当前绑定的纹理对象在同一个目标(Target)上的纹理(任何绑定到GL_TEXTURE_1DGL_TEXTURE_3D的纹理不会受到影响)。
  • 第二个参数为我们打算创建的纹理指定多级渐远纹理的层级,如果你希望单独手工设置每个多级渐远纹理的层级的话。这里我们填0基本级。
  • 第三个参数告诉OpenGL,我们希望把纹理储存为何种格式。我们的图像只有RGB值,因此我们把纹理储存为GL_RGB值。
  • 第四个和第五个参数设置最终的纹理的宽度和高度。我们加载图像的时候提前储存它们这样我们就能使用相应变量了。 下个参数应该一直被设为0(遗留问题)。
  • 第七第八个参数定义了源图的格式和数据类型。我们使用RGB值加载这个图像,并把它们储存在char(byte),我们将会传入相应值。
  • 最后一个参数是真实的图像数据。
解绑:
glBindTexture(GL_TEXTURE_2D, 0);

6: 应用纹理

GLfloat vertices[] = {

// ---- 位置 ---- ---- 颜色 ---- ---- 纹理坐标 ----  

0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // 右上  

0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // 右下 

-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,// 左下  

-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // 左上};



glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, texture1);

glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture1"), 0);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, texture2);

glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture2"), 1);

glBindVertexArray(VAO);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_IN, 0);

glBindVertexArray(0);



使用Soil或者Freeimage加载图像倒立 由于opengl要求y轴0,0 在左下角,图片y的00

在左上角


解决方式:

  1. 我们切换顶点数据的纹理坐标,翻转y值(用1减去y坐标)。
  2. 我们可以编辑顶点着色器来翻转y坐标,自动替换TexCoord赋值:TexCoord = vec2(texCoord.x, 1 - texCoord.y);

你可能感兴趣的:(Opengl备忘4---Texture)