OpenGL

008-基础纹理下篇

2020-07-22  本文已影响0人  清风烈酒2157

Mip贴图

Mip贴图是一种强大的纹理技巧,它不仅可以提高渲染性能,而且可以改善场景的显示质量.它使用标准纹理贴图处理两个常见的问题.

  1. 闪烁(Scintillation,锯齿假影)的效果.当屏幕上被渲染的表面与它所应用的纹理图像相比显得非常小时,就会出现这种效果.
  2. 加载大量的纹理内存对它进行过滤处理,但屏幕上实际显示的只是很少的一部分片段.纹理越大,这个问题所造成的性能影响.

以上解决方案就是使用Mip贴图,

Mip纹理图像是由一系列纹理图像组成,每个图像大小在每个轴的方向上都缩小一半,或者是原来图像像素总和的四分之一.

如图,Mip贴图层并不一定是正方形,但是每个图像的大小都依次减半,直到最后一个图像的大小是1x1的纹理单元.

使用一组正方形Mip贴图所要求的内存比不使用Mip贴图要多出三分之一.

image.png

Mip贴图是由glTexParameteri函数加载.

使用GL_TEXTURE_BASE_LEVELGL_TEXTURE_MAX_LEVEL分别表示基层和最大层.

指定0-4层可以像下面这样调用两次.


//设置mip贴图基层 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0); //设置mip贴图最⼤大层 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,4);

Mip贴图过滤

Mip贴图是在两个基本的过滤模式上又添加了新的变化.

image.png

生成Mip层

对于纹理的Mip层进行预先的计算得到最好的结果.同时让我们生成纹理非常方便.通过

extern void glGenerateMipmap(GLenum target);

一旦加载第0层,就可以为所有纹理生Mip层.

各向异性纹理过滤(anisotropic texture filtering)

当我们从一个倾斜角去观察一个几何图形,和之前观察方向和观察点垂直相比,对周围的纹理单元进行常规采样会导致一些纹理信息丢失.
更为逼真的和准确地采样应用是沿着包含纹理的平面方向进行延伸,使用各向异性过滤进行处理.

image.png

使用举例:


 //设置各向异性过滤
 GLfloat fLargest;
 //获取各向异性过滤的最大数量
 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest);
 //设置纹理参数(各向异性采样)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);

纹理压缩

纹理压缩(Texture compression)是一种专为在三维计算机图形渲染系统中存储纹理而使用的图像压缩技术。与普通图像压缩算法的不同之处在于,纹理压缩算法为 纹素随机存取做了优化

压缩纹理

为了利用OpenGL对压缩纹理的支持,纹理数据一开始并不需要进行压缩,我们可以在加载一幅纹理图像是请求OpenGL对它进行压缩.

通过在glTexImage函数中把internalFormat参数进行设置

image.png
//判断纹理是否被成功压缩 
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);

glGetTexLevelParameter函数提取的压缩纹理格式

image.png

检查一组特定的压缩纹理格式是否得到支持,需要检查一个与这些格式的数量以及相关值的列表.

GL_EXT_texture_compression_s3tc压缩格式如下:

image.png

加载压缩纹理

为了加载预先经过压缩的纹理数据,使用如下函数:


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 heigth,GLint border,GLsizei imageSize,void *data);

void glCompressedTexImage3D(GLenum target,GLint level,GLenum internalFormat,GLsizei width,GLsizei heigth,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的整数次⽅方。(这是因为O
旧版本上的遗留留下的⼀一个要求。当然现在已经可以⽀支持不不是2的整数次⽅方。但是开发者们还是习惯使⽤用以2的整数次⽅方去
参数。)
border参数:允许为纹理理贴图指定⼀一个边界宽度。
format、type、data参数:与我们在讲glDrawPixels函数对应的参数相同

上一篇 下一篇

猜你喜欢

热点阅读