• 纹理映射TextureMapping纹理贴图是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。
  • TextureCoordinateUVWSTR纹理坐标
  • 参考https://blog.csdn.net/shs1992shs/article/details/82766896 |
    - 纹理对象
    - 生成纹理对象索引
    WINGDIAPI void APIENTRY glGenTextures (GLsizei n, GLuint textures);
    - 功能:返回n个位用的未使用的纹理对象名。
    - 指定活动纹理对象
    WINGDIAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
    - 功能:
    当参数textureName第一次赋值并且textureName不是0时,创建一个新的纹理对象,并将其纹理图像数据和纹理属性设置为默认值。接下来的函数调用如glTexImage
    ()、glTexParameter等当将数据存储到纹理对象中。
    当把这个名称绑定到一个先前创建的纹理对象上时,纹理对象变成活动的。可以编辑其内容,如设置纹理坐标等。
    当将纹理对象绑定到textureName为0的名称上时,OpenGL停止使用纹理对象,并返回到未命名的默认纹理。
    - 删除纹理对象
    解除绑定后(非活动纹理对象) ,纹理对象的数据任然存储在纹理资源中,如果纹理资源是有限的,可通过删除纹利对象来释放纹理资源。
    函数:void glDeleteTextures(GLsizei n, const GLuint textureNames)
    - 功能:该函数删除了由参数n所指定的纹理对象,该纹理对象由数组textureName中的元素指定。
    额外说明:如果删除了当前被绑定的纹理,绑定就返回默认的纹理,如同调用glBindTexture()函数的参数textureName值为0。如果试图删除一个不存在的纹理名称,或删除命名为0的纹理名称,该函数操作将被忽略,而不会引起错误。
    |
    - 纹理对象数据
    - 直接创建法
    直接创建纹理的方法是利用函数直接设置各纹理像素点的RGB值,使用这种方法只能生成简单的有一定规律的纹理图像,其无法模拟复杂的、比较自然的纹理图像。
    - 读取外部文件
    WINGDIAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid
    pixels);
    - 功能:
    该函数指定一个二维纹理映射。
    - 参数说明:
    - target:可取值为GL_TEXTURE_2D、GL_PROXY_TEXTURE_2D等。
    - level:表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0。
    - internalFormat:指出了在纹素中存储哪些分量。可取值为从1到4的整数以及下属符号常量GL_ALPHA、GL_ALPHA、GL_ALPHA8等。1表示选择了GL_LUMINANCE分量,2表示选择了LUMINANCE和Alpha两个分量,3表示选择了R、G、B三个分量,4表示选择了R、G、B、A四个分量。
    - width和height:给出了纹理图像的长度和宽度。其指必须为2m+2b,其中b为border的值。如果图像的宽度和高度不符合这个要求,可以使用OpenGL实用库函数gluScaleImage来改变纹理图像的大小。
    - border:为纹理边界宽度,其取值为0(没有边框)或1。
    - format和type:描述了纹理映射的格式和数据类型,它们在这里的意义与在函数glDrawPixels()中的意义相同,事实上,纹理数据与glDrawPixels()所用的数据有同样的格式。
    - pixels:包含了纹理图像数据,这个数据描述了纹理图像本身和它的边框。
    https://blog.csdn.net/ranran125/article/details/103424247https://blog.csdn.net/ranran125/article/details/103424247图像上下颠倒 | WINGDIAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
    - 功能:该函数指定一个一维纹理映射。
    - 参数说明: 参数除第一个参数target应设置为GL_TEXTURE_1D外,其余所有的参数与函数TexImage2D()的一致,不过纹理图像是一维纹素数组,其宽度值必须是2的幂,若有边界则为2m+2。
    参考
    https://blog.csdn.net/dreamcs/article/details/7696069
    https://blog.csdn.net/xianyun2009/article/details/39396317 | | —- | —- | —- | |
    - 纹理参数
    WINGDIAPI void APIENTRY glTexParameter* (GLenum target, GLenum pname, GLfloat param);
    WINGDIAPI void APIENTRY glTexParameter*v (GLenum target, GLenum pname, const GLfloat *params);
    - 参数说明:
    target
    第一个参数可以是GL_TEXTURE_1D或GL_TEXTURE_2D,即表明所用的纹理是一维的还是二维的;
    - 像素滤波
    一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理图像会经过一定的几何变换。可以指定放大和缩小情况下的纹素的插值方法。
    pname
    参数值GL_TEXTURE_MAG_FILTER指定为放大,GL_TEXTURE_MIN_FILTER指定为缩小;
    param
    第三个参数说明插值方式,取值可以为GL_NEARST或者GL_LINEAR。分别表示最近邻插值和线性插值。
    - 环绕方式
    纹理坐标可以超出(0, 1)范围,并且在纹理映射过程中对这些超出的坐标可以进行截取(CLAMP)或重复(REPRAT)。
    pname
    pname可以指定为GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T和GL_TEXTURE_WRAP_R。分别表示对纹理的S、T和R方向指定重复或者截取方式。
    param
    param可以取值为GL_CLAMP,GL_CLAMP_TO_EDGE,GL_CLAMP _TO_BORDER, GL_REPEAT和GL_MIRRORED_REPEAT
    https://blog.csdn.net/elong_2009/article/details/12744057 |
    - 纹理环境
    WINGDIAPI void APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param);
    WINGDIAPI void APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
    指设置纹理颜色如何与片元颜色如何相互作用。
    - 参数说明:
    - target:
    必须是GL_TEXTURE_ENV;
    - 若参数pname是GL_TEXTURE_ENV_MODE,则参数param可以是GL_REPLACE、GL_DECAL、GL_MODULATE、GL_BLEND或GL_ADD,以说明纹理值怎样与原来表面颜色相结合的处理方式;
    - 若参数pname是GL_TEXTURE_ENV_COLOR,则参数param是包含四个浮点数(分别是R、G、B、A分量)的数组,这些值只在采用GL_BLEND纹理函数时才有用,它指定了混合操作的颜色,而纹理图像上的颜色则指定了GL_TEXTURE_ENV_COLOR值的权重。
    - 下面的两个表说明了纹理颜色和片元颜色如何作用。
    其中C和A分别表示 RGB值和alpha值。
    无下标的C和A表示通过计算得到的最终结果。
    下标s表示纹理值,下标f表示片元值,c表示GL_TEXTURE_ENV_COLOR指定的值。
    image.pngimage.png | |

OpenGL纹理坐标

  • 指定WINGDIAPI void APIENTRY glTexCoord* (GLTYPE s);
  • OpenGL生成纹理坐标glTexGenWINGDIAPI void APIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);
    • 参数coord
      必须是GL_S、GL_T、GL_R或GL_Q
    • pname参数
      为GL_TEXTURE_GEN_MODE、GL_OBJECT_PLANE或GL_EYE_PLANE,
    • 如果是GL_TEXTURE_GEN_MODE,param就是个整数,
      即GL_OBJECT_LINEAR,GL_EYE_LINEAR,GL_SPHERE_MAP,GL_REFLECTION,GL_NORMAL_MAP之一;
    • 如果pname取其他可能的值,param就是指向数组的指针
    • 参考