OpenGL入门-4

OpenGL入门-4,第1张

图像存储空间 = 图像的高度 * 图像宽度 * 每个像素的镇羡信字节数

RGB(8位),宽度:199像素点。图片每行需要多少存储空间?

199 * 3 * 8 = 597字节

tga(纹理文件)。1个字节1个字节。

OpenGL纹理御轮文件:.tga文件.

OpenGL ES! 压缩图片文件.png/jpeg压缩

当纹理来使用。

//改变像素存储方式

void glPixelStorei(GLenum pname, GLint param)

//恢复像素存储方式

void glPixelStoref(GLenum pname,GLfloat param)

//举例:

//参数1:GL_UNPACK_ALTGNMENT 指定OpenGL 如何从数据缓存区中解包图像数据

//参数2:表示参数GL_UNPACK_ALIGNMENT 设置的值

//GL_UNPACK_ALIGNMENT 指内存中每个像素行起点的排列请求,允许设置为1(byte排列)、2(排列为偶数btye的行)、4(字word排列)、8(行从双字节边界开始)

glPixelStorei(GL_UNPACK_ALIGNMENT,1)

参数1:x,矩形左下角的窗口坐标

参数2:y,矩形左下角的窗口坐标

参数3:width,矩形的宽,以像素为单位

参数4:height,矩形派汪的高,以像素为单位

参数5:format,OpenGL的像素格式

参数6:type,解释参数pixels指向的数据,告诉OpenGL 使用缓存区中的什么数据类型来存储颜色分量,像素数据的数据类型。

参数7:pixels,指向图形数据的指针

void glReadPixls(GLint x, GLint y, GLSizei width, GLSizei height, GLenum format, GLenum type, const void *pixels)

glReadBuffer(mode)->指定读取的缓存

glWriteBuffer(mode)->指定写入的缓存

void glTexImage1D(GLenum target,GLint level, GLint internalformat,GLsizei width, GLint border, GLenum format, GLenum type, void *data)

void glTextImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint bordr, GLenum format, GLenum type,void *data)

void glTextImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,GLsizei depth, GLint bordr, GLenum format, GLenum type,void *data)

void glTexSubImage1D(GLenum target, GLint level, GLint xOffset, GLsizei width, GLenum format, GLenum type, const GLvoid *data)

void glTexSubImage2D(GLenum target, GLint level, GLint xOffset,GLint yOffset,GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data)

void glTexSubImage3D(GLenum target, GLint level, GLint xOffset,GLint yOffset,GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *data)

void glCopyTexSubImage1D(GLenum target, GLint level, GLint xOffset, GLint x, GLint y, GLsizei width)

void glCopyTexSubImage2D(GLenum target,GLint level,GLint xOffset, GLint yOffset,GLint x, GLint y,GLsizei width, GLsizei height)

void glCopyTexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLint x, GLint y, GLsizei width, GLsizei height)

void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformt, GLint x, GLint y, GLsizei width, GLint border)

void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformt, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)

x,y在颜色缓存区中指定了开始读取纹理数据的位置;缓存区里的数据,是源缓存区通过glReadBuffer设置的。

//使用函数分配纹理对象

//指定纹理对象的数量 和 指针(指针指向一个屋符号整形数组,由纹理对象标识符填充)。

void glGenTextures(GLsizei n, GLint *texTures)

//绑定纹理状态

//参数target: GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D

//参数texture:需要绑定的纹理对象

void glBindTexture(GLenum target, GLunit texture)

//删除绑定纹理对象

//纹理对象 以及 纹理对象指针(指针指向一个无符号整形数组,由纹理对象标识符填充)。

void glDeleteTexture(GLsizei n, GLint *textures)

//测试纹理对象是否有效

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

GLboolean glIsTexture(GLuint texture)

glTexParameterf(GLenum target, GLenum pname, GLFloat param)

glTexParameteri(GLenum target, GLenum pname, GLint param)

glTexParameterfv(GLenum target, GLenum pname,GLint param)

glTexParameteriv(GLenum target, GLenum pname, GLint *param)

参数1:target,指定这些参数将要应用在那个纹理模式上,比如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。

参数2:pname,指定需要设置那个纹理参数。

参数3:param,设定特定的纹理参数值。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST)

//纹理缩小时,使用邻近过滤

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GLLINEAR)

//纹理放大时,使用线性过滤

参数1:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D

参数2:GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R,针对s,t,r坐标

参数3:GL_REPEAT、GL_CLAMP、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER

GL_REPEAT:OpenGL在纹理坐标超过1.0的方向上对纹理进行重复;

GL_CLAMP:所需要的纹理单元取自纹理边界或TEXTURE_BORDER_COLOR.

GL_CLAMP_TO_EDGE环绕模式强制对范围之外的纹理坐标沿着合法的纹理单元的最后一行或者最后一列来进行采样。

GL_CLAMP_TO_BORDER:在纹理坐标在0.0到1.0范围之外的只使用边界纹理单元。边界纹理单元是作为围绕基本图像的额外的行和列,并与基本纹理图像一起加载的。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE)

OpenGL像素格式

像素数据的数据类型

//设置mip贴图基层

glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0)

//设置mip贴图最大层

glTexParamteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_LEVEL,0)

GLint comFlag

//判断纹理是否被成功压缩

glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag)

//根据选择的压缩纹理格式,选择最快、最优、自行选择的算法方式选择压缩格式

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST)

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST)

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE)

void glCompressedTexImage1D(GLenum target,GLint level,Glenum internalFormat,GLsizei width,GLint border, GLsizei imageSize, void *data)

void glCompressedTexImage2D(GLenum target,GLint level, GLenum internalFormat, GLsizei width, GLint height, GLint border, GLsizei imageSize, void *data)

void glCompressedTextImage3D(GLenum target, Glint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,GLint border, GLsizei imageSize,void *data)

target: GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D.

level:指定所加载的mip贴图层次。一般我们都把这个参数设置为0.

internalformat:每个纹理单元中存储多少颜色成分

width、height、depth参数:指加载纹理底层的宽度、高度、深度。注意:这些值必须是2的整数次方。(这是因为旧版本上遗留下的一个要求。当然现在已经可以支持不是2的整数次方。但是开发者还是习惯使用2的整数次方去设置参数)

border参数:允许为纹理贴图指定一个边界宽度。

format、type、data参数:与我们在讲glDrawPixels函数对应的参数相同

OpenGL使用的图片数据(纹理)都是tga格式的厅斗,而iOS/OpenGL ES使用PNG/JPEG格式的图片数据,其最终都是解码成位图,进行显示的。

纹理就像我们的贴纸一样,在我们的原本颜色单一的物体上贴上想要的纹理图片,就能变扮蚂磨得更好看更真实。

一个图形在帧缓存区中的存储空间,可以根据如下公式计算

每个像素的字节数相当于RGBA 4种颜色通道 * 每个颜色通道8个字节

使用建议:纹理缩小时,使用邻近过物凯滤,纹理放大时,使用线性过滤

设置环绕方式的函数

UNSIGNED_BYTE_3_3_2 ,表示8位中3个颜色分量所占的个数,第一个分量3、第二个分量3、第三个分量2。

UNSIGNED_BYTE_2_3_3_REV ,表示8位中3个颜色分量的个数,第一个分量2、第二个分量3、第三个分量3。

我们用 (x, y, z, w)表示顶点坐标,用 (s, t, r, q)表示纹理坐标。一般我们常用2D纹理坐标。

主要纹理函数的应用

我们来看下加上了纹理的金字塔效果图


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/12211477.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存