(1)纹理坐标:
使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0,0)也就是纹理图片的左下角,终结于纹理图片的右上角(1,1)。
GLfloat texCoords[] = { 0.0f, 0.0f, // 左下角
1.0f, 0.0f, // 右下角
0.5f, 1.0f // 顶部位置
};
2:
环绕方式 | 描述 |
---|---|
GL_REPEAT | 纹理的默认行为,重复纹理图像 |
GL_MIRRORED_REPEAT | 和GL_REPEAT 一样,除了重复的图片是镜像放置的 |
GL_CLAMP_TO_EDGE | 纹理坐标会在0到1之间,超出的部分会重复纹理坐标的边缘,就是边缘被拉伸 |
GL_CLAMP_TO_BORDER | 超出的部分是用户指定的边缘的颜色 |
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_NEAREST
和GL_LINEAR
。组作为颜色值:
float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
3
GL_NEAREST
和
GL_LINEAR
。
4;
过滤方式 | 描述 |
---|---|
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_1D
和GL_TEXTURE_3D
的纹理不会受到影响)。GL_RGB
值。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
在左上角
解决方式:
y
值(用1减去y坐标)。y
坐标,自动替换TexCoord
赋值:TexCoord = vec2(texCoord.x, 1 - texCoord.y);