glTexImage2D 中 format internalformat type 参数的含义

在OpenGL中初始化一个纹理时,glTexImage2D()函数中指定纹理格式数据有三个参数,如下面的红字:

 
 
void glTexImage2D(GLenum target,
 GLint level,
GLint internalFormat,
 GLsizei width,
 GLsizei height,
 GLint border,
GLenum format,
GLenum type,
 const GLvoid * data);
这里关系到OpenGL中的 pixel transfer 操作,pixel transfer 表示从内存到显存(unpack)或者从显存到内存(pack)的过程。显然glTexIamge2D是unpack操作。
 
internalformat是指OpenGL内部存储这个纹理时所用的格式,同时指定了哪些分量以及每个分量对应的bit数,可以理解为显存中存储的格式,形如GL_RGB, GL_RGB32F, GL_COMPRESSED_RGB。格式形如GL_R32F,表示这个纹理只有一个分量,分量为32位浮点数,OpenGL网站上有详细说明。值得注意的是,如果该格式为GL_RGB,GL_RGBA,GL_DEPTH_COMPONENT等这种只指定分量个数的,那么OpenGL中会自动对每个分量进行截断(clamp),保证其范围为[0, 1]。因此如果不需要OpenGL自动截断,则应指定internalformat为GL_RGB16F类似的格式。
 
 
format 和 type 指定的是client内存中存储的格式,也就是data指针中的所存放的texture的格式。

format形如GL_RG, GL_RED等,即指定哪些颜色分量。

type是像素数据的bit depth,包括GL_UNSIGNED_BYTE,GL_FLOAT,GL_UNSIGNED_SHORT_5_6_5等。
类似的,glReadPixels()函数中也有一个format和type,和上述的type,format含义相同,即按照指定的格式从OpenGL显存内部读出到buffer中,也就是 pack 操作的格式。

查看原文:http://wangyudong.xyz/?p=266
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
glTexImage2D函数是用来指定一个二维纹理图像的函数。其参数如下: ```C++ void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *data); ``` - target:指定要设置的纹理目标。可以是以下几个值之一: - GL_TEXTURE_1D:一维纹理。 - GL_TEXTURE_2D:二维纹理。 - GL_TEXTURE_3D:三维纹理。 - GL_TEXTURE_CUBE_MAP_POSITIVE_X:立方体贴图的正 X 面。 - GL_TEXTURE_CUBE_MAP_POSITIVE_Y:立方体贴图的正 Y 面。 - GL_TEXTURE_CUBE_MAP_POSITIVE_Z:立方体贴图的正 Z 面。 - GL_TEXTURE_CUBE_MAP_NEGATIVE_X:立方体贴图的负 X 面。 - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:立方体贴图的负 Y 面。 - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:立方体贴图的负 Z 面。 - level:指定要设置的纹理的细节级别。0 表示最底层的细节级别。 - internalformat:指定纹理每个像素的颜色组件数量和类型。可以是以下几个值之一: - GL_RED:一个组件,每个组件8位。 - GL_RG:两个组件,每个组件8位。 - GL_RGB:三个组件,每个组件8位。 - GL_RGBA:四个组件,每个组件8位。 - GL_DEPTH_COMPONENT:一个深度值,每个组件16或24位。 - GL_DEPTH_STENCIL:一个深度值和一个模板值,每个组件24或32位。 - width:纹理图像的宽度,以像素为单位。 - height:纹理图像的高度,以像素为单位。 - border:指定纹理边界的宽度。必须为0或1。 - format:指定像素数据的格式。可以是以下几个值之一: - GL_RED:每个像素一个红色组件。 - GL_RG:每个像素两个组件:红色和绿色。 - GL_RGB:每个像素三个组件:红色、绿色和蓝色。 - GL_RGBA:每个像素四个组件:红色、绿色、蓝色和 alpha 值。 - GL_DEPTH_COMPONENT:每个像素一个深度值。 - GL_DEPTH_STENCIL:每个像素一个深度值和一个模板值。 - type:指定像素数据的类型。可以是以下几个值之一: - GL_UNSIGNED_BYTE:每个组件8位无符号整数。 - GL_BYTE:每个组件8位有符号整数。 - GL_UNSIGNED_SHORT:每个组件16位无符号整数。 - GL_SHORT:每个组件16位有符号整数。 - GL_UNSIGNED_INT:每个组件32位无符号整数。 - GL_INT:每个组件32位有符号整数。 - GL_FLOAT:每个组件32位浮点数。 - GL_UNSIGNED_BYTE_3_3_2:每个像素3位红色、3位绿色和2位蓝色,以8位无符号整数表示。 - GL_UNSIGNED_SHORT_5_6_5:每个像素5位红色、6位绿色和5位蓝色,以16位无符号整数表示。 - GL_UNSIGNED_SHORT_4_4_4_4:每个像素4位红色、4位绿色、4位蓝色和4位 alpha 值,以16位无符号整数表示。 - GL_UNSIGNED_SHORT_5_5_5_1:每个像素5位红色、5位绿色、5位蓝色和1位 alpha 值,以16位无符号整数表示。 - data:指向包含纹理图像数据的指针。 注意,glTexImage2D函数并不会直接将纹理图像加载到 GPU 内存。它只是告诉 OpenGL 现在有一个纹理图像,需要分配内存并加载到显存。实际上,纹理图像的加载是在纹理绑定后调用glTexSubImage2D函数时发生的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值