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-2
OpenGL 像素格式
常量 | 描述 |
---|---|
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 | 每个像素包含⼀个深度值和⼀个模板值 |