OGL纹理特征和glTexImage2D gluScaleImage glCopyTextImage2D

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得到平滑的图像放大效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值