glTexImage2D函数
原型:
glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
实例:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
解释:
glTexImage2D — specify a two-dimensional texture image,传输数据到GPU中且创建一个纹理对象
。
target参数是创建的纹理类型:
可以是GL_TEXTURE_2D, GL_TEXTURE_1D, GL_TEXTURE_3D
GL_TEXTURE_1D_ARRAY; GL_PROXY_TEXTURE_1D_ARRAY;在 OGL 3.0以上才可用。
level参数是mipmap的等级,表示多种分辨率的图像,如果只有一种那么就是0。
internalformat
确定哪些成分(RGBA,深度,亮度或强度)被选定为图像的纹理单元,这些预定义的符号都表明了纹理单元值应该被规范化(映射到[0,1])范围内,并且存储到一个定点的表示中(如果标记名中包含了一个数值,它指定了位数)。可以是下面的数值:
#define GL_COLOR_INDEX 0x1900
#define GL_STENCIL_INDEX 0x1901
#define GL_DEPTH_COMPONENT 0x1902
#define GL_RED 0x1903
#define GL_GREEN 0x1904
#define GL_BLUE 0x1905
#define GL_ALPHA 0x1906
#define GL_RGB 0x1907
#define GL_RGBA 0x1908
#define GL_LUMINANCE 0x1909
#define GL_LUMINANCE_ALPHA 0x190A
在OGL 3.0后internalformat可以指定为浮点数的,也就是不是规范化的。
在这里可以指定纹理的压缩,存储为特定的压缩纹理格式。例如:
#define GL_COMPRESSED_RED_RGTC1 0x8DBB
#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
#define GL_COMPRESSED_RG_RGTC2 0x8DBD
#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
也可以定义一种特定的成分分辨率,例如,如果internalFormat设置为GL_R3_G3_B2表示3位红,3位蓝,2位绿色。
对于确定大小的深度和模板格式OGL3.0增加了:
#define GL_DEPTH_COMPONENT16 0x81A5
#define GL_DEPTH_COMPONENT24 0x81A6
#define GL_DEPTH_COMPONENT32 0x81A7
#define GL_DEPTH24_STENCIL8 0x88F0
#define GL_DEPTH32F_STENCIL8 0x8CAD
width和height参数表示纹理图像的宽度和高度。
border表示边框的宽度,可以为0.对于OGL 3.1实现必须为0.
format: GPU纹理单元的存储格式,
Specifies the format of the texel data. Must match
internalformat
. The following symbolic values are accepted:
GL_ALPHA
,
GL_RGB
,
GL_RGBA
,
GL_LUMINANCE
, and
GL_LUMINANCE_ALPHA
.
#define GL_COLOR_INDEX 0x1900
#define GL_STENCIL_INDEX 0x1901
#define GL_DEPTH_COMPONENT 0x1902
#define GL_RED 0x1903
#define GL_GREEN 0x1904
#define GL_BLUE 0x1905
#define GL_ALPHA 0x1906
#define GL_RGB 0x1907
#define GL_RGBA 0x1908
#define GL_LUMINANCE 0x1909
#define GL_LUMINANCE_ALPHA 0x190A
type是GPU纹理单元的数据类型
:
Specifies the data type of the texel data. The following symbolic values are accepted:
GL_UNSIGNED_BYTE
,
GL_UNSIGNED_SHORT_5_6_5
,
GL_UNSIGNED_SHORT_4_4_4_4
, and
GL_UNSIGNED_SHORT_5_5_5_1
.
/* DataType */
#define GL_BYTE 0x1400
#define GL_UNSIGNED_BYTE 0x1401
#define GL_SHORT 0x1402
#define GL_UNSIGNED_SHORT 0x1403
#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
#define GL_UNSIGNED_SHORT_5_6_5 0x8363
#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
type元素类型没有*REV的是小端存储模式,有*REV的是整型大数据(超过一字节)反转内部字节为单位的顺序,也就是大端存储模式。
pixels
:Specifies a pointer to the image data in memory.
pixels是像素存储的CPU内存指针, CPU图像数据包括了边框。
纹理图像的internalformat可能会影响纹理操作的性能,有些OGL实现GL_RGBA格式比GL_RGB格式更快。纹理图像的内部格式也可能影响纹理图像所消耗的内存,GL_R3_G3_B2的纹理就比GL_RGBA纹理小。GL_DEPTH_COMPONENT* 的internalformat类型纹理存储了深度值,它更常用于渲染阴影。 GL_DEPTH32F_STENCIL8存储了相同纹理中的深度和模板值。
纹理数据和glDrawPixels使用的数据具有相同的格式,因此glPixelStore*(),glPixelTransfer*()函数所进行的设置对它也起作用。例如:glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluScaleImage函数
用来更改纹理图像的大小。
gluScaleImage — scale an image to an arbitrary size 任意的大小
GLint gluScaleImage( GLenum format,
GLsizei wIn,
GLsizei hIn,
GLenum typeIn,
const void * dataIn,
GLsizei wOut,
GLsizei hOut,
GLenum typeOut,
GLvoid* dataOut);
对于OGL2.0以下的纹理大小必须是2的整数次方,可以用gluScaleImage来修改纹理图像大小。该函数其实是在wIn,hIn, wOut,hOut之间进行线性插值和箱过滤进行缩放,最终写入到dataOut中,可以用dataOut重新定义纹理对象。
glCopyTexImage2D函数
帧缓存区本身也可以作为纹理数据使用,glCopyTexImage2D从帧缓存区读取一块矩形像素,并且把它作为一个新纹理的纹理单元。
void glCopyTexImage2D( GLenum target,
GLint level,
GLenum internalformat,
GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLint border);
glCopyTexImage2D — copy pixels into a 2D texture image
像素是从当前的GL_READ_BUFFER读取的,它处理的过程像调用了glCopyPixels,但像素数据并不是放在帧缓存区中,而是放入纹理内存中。glPixelTransfer*和其它像素传输操作的设置也会对它产生作用。
level就是多重纹理等级。
internalformat指定那些成分被用作纹理单元。
border表示边框的宽度,可以为0.对于OGL 3.1实现必须为0.
x,y是OGL屏幕坐标系的截取矩形的起点。
width, height是屏幕坐标系的宽高像素。
在OGL 3.0及以后的版本,可以使用帧缓存区对象直接渲染到纹理内存,从而高效的执行和glCopyPixels2D相同的操作。
图像拷贝和抗锯齿图像绘制的优化技巧
glCopyTexImage2D和glCopyPixels2D可以用图像的XOR运算:
A1 = A XOR B
B1 = A1 XOR B 这时B1变为了A图像。
A2 = A1 XOR B1
这时A2变为了B图像。
避免图像在GPU拷贝回CPU内存。
可以多次使用glDrawPixels加alpha值的变化来绘制抗锯齿圆形画刷,偏移绘制结合alpha得到平滑的图像放大效果