OGL中纹理分为两种类型,一种是常规的纹理,另一种是缓存纹理。前者和特定的纹理类型相关联,而后者则仅仅作为输出的缓存区域,和Frame buffer object粘合的纹理就是缓存纹理。不过这两者的创建过程很相似,都是利用glGenTexture函数实现纹理ID的创建,然后利用glBindTexture将ID号绑定到指定的纹理对象上。常规纹理绑定的纹理对象是指定的纹理类型,而纹理缓存则绑定到GL_TEXTURE_BUFFER类型的纹理。绑定之后,就可以向纹理存储传递初始化数据。前者通过glTexSubImage1D函数向指定的纹理类型提交数据,而后者则通过glTexBuffer向缓存纹理中提交数据,主要是通过GL_ARRAY_BUFFER为对应的缓存纹理提供存储支持。
Load Texture
上面简单的介绍了纹理的类型,下面主要介绍特定的纹理类型进行纹理加载的步骤。第一步需要为纹理分配指定大小的存储空间。纹理内存的空间并不一定和需要加载的纹理的大小是对应的,主要是为了渲染的时候能够有效的对图片进行放缩处理。因此,在分配内存时需要根据需要创建的纹理的尺寸以及需要创建的纹理的放缩的层次分配足够的存储,一般会比最大的纹理层次所占用的存储空间大1/3。glTexStorage2D函数的第一个参数指定所需要分配的纹理类型,在这里特定是GL_TEXTURE_2D,第二个参数levels指定所需要创建的纹理图像的层次数目,主要是用空间换时间。internalformat参数则用于指定纹理的具体类型,用以控制纹理的内存大小,接下来两个参数指定最顶层的纹理的宽度和高度。需要注意的是这里会默认下一层纹理的大小相对于上一层原来的宽度和高度缩小一半,当然也可以利用glTexSubStorage2D为每一个层次指定纹理的