OpenGL

08-OpenGL 纹理基础(上)

2019-05-24  本文已影响0人  SPIREJ

1. 读取文件

GLbyte *gltReadTGABits(const char *szFileName,
                       GLint *iWidth,
                       GLint *iHeight,
                       GLint *iComponents,
                       GLenum *eFormat,
                       GLbyte *pData = NULL);

szFileName:纹理文件名称
iWidth、iHeight:宽度地址、高度地址
iComponents:组件地址
eFormat:格式地址
返回值:GLbyte* 指向图像数据的指针

2. 载入纹理

void GLAPIENTRY glTexImage2D (GLenum target,
                              GLint level,
                              GLint internalformat,
                              GLsizei width,
                              GLsizei height,
                              GLint border,
                              GLenum format,
                              GLenum type,
                              const GLvoid *pixels);

target: 纹理维度 GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D
level: mip贴图层次,一般设置为0
internalformat: 每个纹理单元中存储多少颜色成分
width、height、depth: 加载纹理的宽度、高度、深度。习惯使用2的整数次方去设置这些参数
border: 允许为纹理贴图指定一个边界宽度
format: OpenGL 像素格式
type: 解释参数pixels指向的数据,
告诉OpenGL 使⽤缓存区中的什么数据类型来存储颜⾊分量,像素数据的数据类型,
参考 表1-2
pixels: 指向图形数据的指针

3. 设置纹理参数

void glTexParameterf (GLenum target, GLenum pname, GLint param);
void glTexParameteri (GLenum target, GLenum pname, GLint param);
void glTexParameterfv (GLenum target, GLenum pname, GLint param);
void glTexParameteriv (GLenum target, GLenum pname, GLint param);

target: 纹理维度 GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D
pname:指定需要设置哪个纹理参数
param:指定特定的纹理参数的值

//参数1:纹理维度
//参数2:为S/T坐标设置模式
//参数3:环绕模式
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );


//参数1:纹理维度
//参数2:线性过滤

//纹理缩小时,使用邻近过滤
glTexParameteri (FL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

//纹理放大时,使用线性过滤
glTexParameteri (FL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

4. 分配纹理对象

void glGenTextures (GLsizei n, GLuint *textures);

指定纹理对象的数量指针(指针指向一个无符号整型数组,由纹理对象标识符填充)

5. 绑定纹理状态

void glBindTexture (GLenum target, GLuint texture);

target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
texture:需要绑定的纹理对象

6. 删除绑定纹理对象

void glDeleteTextures (GLsizei n, const GLuint *textures);

7. 测试纹理对象是否有效

GLboolean glIsTexture (GLuint texture);

如果texture是一个已经分配空间的纹理对象,那么这个函数会返回GL_TRUE,否则会返回GL_FALSE

表1-1环绕方式

环绕方式 描述
GL_REPEAT 对纹理的默认行为。重复纹理图像
GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图像是镜像放置的
GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果
GL_CLAMP_BORDER 超出的坐标为用户指定的边缘颜色

表 1-2OpenGL 像素格式

常量 描述
GL_RGB 描述红、绿、蓝顺序排列的颜色
GL_RGBA 按照红、绿、蓝、Alpha顺序排列的颜⾊
GL_BGR 按照蓝、绿、红顺序排列颜⾊
GL_BGRA 按照蓝、绿、红、Alpha顺序排列颜⾊
GL_RED 每个像素只包含了了⼀个红⾊分量
GL_GREEN 每个像素只包含了一个绿⾊分量
GL_BLUE 每个像素只包含了⼀个蓝色分量
GL_RG 每个像素依次包含了一个红色和绿色的分量
GL_RED_INTEGER 每个像素包含了⼀个整数形式的红色分量
GL_GREEN_INTEGER 每个像素包含了一个整数形式的绿⾊分量
GL_BLUE_INTEGER 每个像素包含了一个整数形式的蓝⾊分量
GL_RG_INTEGER 每个像素依次包含了一个整数形式的红⾊、绿色分量
GL_RGB_INTEGER 每个像素包含了一个整数形式的红⾊、蓝色、绿色分量
GL_RGBA_INTEGER 每个像素包含了一个整数形式的红色、蓝色、绿色、Alpah分量
GL_BGR_INTEGER 每个像素包含了一个整数形式的蓝色、绿⾊、红⾊分量
GL_BGRA_INTEGER 每个像素包含了一个整数形式的蓝色、绿色、红⾊、Alpah分量
GL_STENCIL_INDEX 每个像素只包含了一个模板值
GL_DEPTH_COMPONENT 每个像素只包含一个深度值
GL_DEPTH_STENCIL 每个像素包含⼀个深度值和⼀个模板值
上一篇下一篇

猜你喜欢

热点阅读