OpenGL-纹理相关函数

2020-07-19  本文已影响0人  过气的程序员DZ

开场白

本文主要记录一些OpenGL中有关纹理相关的函数,有些函数使用频率不高,简单记录一下,为将来遇到使用场景时,有个快速的查看途经。

1.改变像素存储方式

void glPixelStorei(GLenum pname, GLint param);
void glPixelStroef(GLenum pname, GLint param);

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

示例:
glPixelStorei(GL_UNPACK_ALIGNMENT,1);

使用频率:

2. 颜色缓冲区中的内容作为像素直接读取

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

使用频率:

3.指定读取/写入的缓冲区

//读取
void glReadBuffer(GLenum mode);
//写入
void glWriteBuffer(GLenum mode);

使用频率:

4. 加载纹理

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

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

void glTexImage3D(GLenum target, GLint level, GLint 
internalformat, GLSizei width, GLsizei height, GLsizei 
depth, GLint border, GLenum format, GLenum type, void *data);

使用频率:

5. 更新纹理和插入替换纹理

更新纹理

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, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, 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);

这两类函数与加载纹理glTexImage2D函数中的参数列表相差不多。
使用频率:

6.从颜色缓冲区中拷贝出纹理

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);

参数与前面的记录过的差不多,所以不再啰嗦了。参数大概就是要确定读取颜色缓冲区中的范围。缓冲区中的数据,是通过glReadBuffer设置的。
==注意:==不存在glCopyTextImage3D ,因为颜⾊缓存区是2D的,无法从中获取体积数据。

使用频率:

7.纹理对象相关函数

分配纹理对象

void glGenTextures(GLsizei n, GLuint * textTures);

绑定纹理

void glBindTexture(GLenum target, GLunit texture);

删除绑定纹理对象

void glDeleteTextures(GLsizei n, GLuint *textures);

测试纹理对象是否有效

GLboolean glIsTexture(GLuint texture)

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

8.设置纹理参数

glTexParameterf(GLenum target, GLenum pname, GLFloat param);
glTexParameteri(GLenum target, GLenum pname, GLint param);
glTexParameterfv(GLenum target, GLenum pname, GLFloat *param);
glTexParameteriv(GLenum target, GLenum pname, GLint *param);

示例:缩放

//放大缩小使用临近过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
//放大缩小使用线性过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

GL_NEAREST和GL_LINEAR区别:
效果上来说GL_NEAREST边缘会有些锯齿,而GL_LINEAR边缘过滤的比较好。


原理:
临近模式GL_NEAREST:获取最近像素点的颜色值



线性模式GL_LINEAR:获取周边颜色的混合值


示例:环绕方式

glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE);

纹理相关扩展

纹理中的坐标系是用s、t、r标示,这个可以理解为s对应x,t对应y,z对应r。



纹理中的点与屏幕显示对应的点是可以自定义匹配的,可以理解为‘贴图’。可以正着贴,也可以倒着贴


正着贴
如图:正着贴,也就是(0,0)对应(0,0)、(0,1)对应(0,1)、(1,1)对应(1,1)、(1,0)对应(1,0)
倒着贴

如图:倒着贴,也就是(0,0)对应(0,1)、(0,1)对应(0,0)、(1,1)对应(1,0)、(1,0)对应(1,1)

小结

本文写给未来的自己,如果对相关知识点忘记了,记得回来看哦。---过去的自己,留!

上一篇下一篇

猜你喜欢

热点阅读