漫谈C++内存和OpenGL各种缓冲对象(下)

OpenGL的纹理缓冲对象创建、释放、使用
        纹理用于给模型贴上颜色,类似于顶点缓冲也是GPU中的一块显存,用图片格式保存了CPU段传入的数据。纹理属性包括纹理大小、颜色通道个数(RGBA\RGB)。纹理宽度尽量遵守2的幂次方规律,这样从CPU中读取数据性能更好。纹理的使用流程:先创建纹理对象名称,绑定纹理后写入图片数据,然后激活纹理单元并绑定纹理,再定义纹理采样器对应的纹理单元。
  (1)void glGenTextures(GLsizei n, GLuint * textures);
         类似顶点缓冲,纹理对象也有创建、绑定、写入、部分写入、删除等API。此API命令GPU创建了一组纹理对象名称,n为纹理对象个数。
  (2)void glBindTexture(GLenum target, GLuint texture);
        命令GPU根据纹理对象名称申请一块缓冲或者绑定到已有的纹理缓冲对象,并将此纹理对象放入当前被使用的纹理单元中。输入参数target为纹理类型,GL_TEXTURE_2D和GL_TEXTURE_CUBE_MAP两种。texture为纹理对象名称。一个纹理对象可以放入多个纹理单元中,修改一个纹理对象会导致所有相关的纹理单元中纹理被修改。纹理单元可以让我们在shader中使用超过一个的纹理。
  (3)void glActiveTexture(GLenum texture);
        激活指定的纹理单元。输入参数texture为纹理单元,GL_TEXTUREi。
  (4)void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * data);
        写入CPU中图片数据到GPU纹理缓冲中。第一个参数指定了纹理目标(Target)。设置为GL_TEXTURE_2D意味着会生成与当前绑定的纹理对象在同一个目标上的纹理(任何绑定到GL_TEXTURE_1D和GL_TEXTURE_3D的纹理不会受到影响)。第二个参数为纹理指定多级渐远纹理的级别,如果你希望单独手动设置每个多级渐远纹理的级别的话。这里我们填0,也就是基本级别。第三个参数告诉OpenGL我们希望把纹理储存为何种格式。即在GPU中图片存储形式,主要指定几个通道。第四个和第五个参数设置最终的纹理的宽度和高度。下个参数应该总是被设为0(历史遗留的问题)。第七个参数定义了源图的格式,即源图几个通道,有GL_ALPHA(只有alpha通道), GL_LUMINANCE(只有luminance值), GL_LUMINANCE_ALPHA(只有luminance值和alpha值), GL_RGB, GL_RGBA。第八个参数定义了源图每个通道的数据类型BYTE,GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_4_4_4_4, and GL_UNSIGNED_SHORT_5_5_5_1。最后一个参数是真正的图像数据,从CPU内存读数据时遵守glPixelStorei设置的对齐规则,第一个数据对应的是纹理中左下角那个顶点,一直到最后一个数据对应纹理右上角那个顶点。
           void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data);
          写入CPU数据到GPU部分纹理缓冲中。输入参数中比较特殊的xoffset、yoffset为离起始点位置的偏移量。
  (5)void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
         复制GPU纹理缓冲数据到另外的缓冲中。输入参数中x、y表示从源目标左下角偏移x、y位置的地方开始拷贝高度height,宽度width的数据。
          void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
        复制部分GPU纹理缓冲到另外的缓冲中。输入参数中xoffset、yoffset表示从源缓冲左下角偏移x、y位置的地方开始拷贝高度height,宽度width的数据到离起始点xoffset、yoffset偏移量的目标缓冲中。
  (6)void glTexParameter*(GLenum target, GLenum pname, GLint param);
        定义纹理属性。输入参数中target指定纹理类型GL_TEXTURE_2D,pname指定修改参数GL_TEXTURE_MIN_FILTER(纹理缩小), GL_TEXTURE_MAG_FILTER(纹理放大), GL_TEXTURE_WRAP_S(纹理环绕方式), or GL_TEXTURE_WRAP_T。
纹理缩小和放大时,需要指定纹理映射算法。GL_NEAREST为直接去原始纹理限定区域中最接近的一个像素的信息作为映射点,效果比较失真但性能好。GL_LINEAR为根据原始纹理最接近的四个像素信息计算出来的加权平均值,作为映射点,效果有过渡性能差些。纹理环绕方式指实际纹理采样坐标超过了[0,1]范围,需要规定纹理外面怎么采样,通常有GL_CLAMP_TO_EDGE(以纹理的边界颜色填充), GL_REPEAT(重复纹理), 和 GL_MIRRORED_REPEAT(镜像重复)。
  (7)void glDeleteTextures(GLsizei n, const GLuint * textures);
        删除纹理。输入参数中n为要删除的纹理对象个数,textures为要删除的纹理对象名称。

原文链接: https://www.cnblogs.com/wangxydela/p/17019999.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    漫谈C++内存和OpenGL各种缓冲对象(下)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/309104

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午10:51
下一篇 2023年2月16日 上午10:51

相关推荐