美文网首页OpenGL
008-基础纹理下篇

008-基础纹理下篇

作者: 清风烈酒2157 | 来源:发表于2020-07-22 10:03 被阅读0次

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函数对应的参数相同

相关文章

  • 008-基础纹理下篇

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

  • 衣服作为礼物怎么用包装纸包装?

    用礼物纸包装衣服的方法。 礼盒先生 基础礼物包装008-衣服01【图文版】 1. 基础礼物包装008-衣服01↓ ...

  • OpenGLEs 纹理的基础知识

    纹理的基础知识 2D 纹理 2d纹理是OpenGlES中最基础和普遍的一种纹理结构。一个2d纹理,就是图片的数据的...

  • 基础纹理

    纹理只是一种能够应用到场景中的三角形上的图像数据,它通过经过过滤的纹理单元(texel,相当于纹理的像素)填充到实...

  • 纹理基础

    纹理基础 之前我们对图元渲染都是用线段或者表面颜色,但这样的效果还不够现实,如果加上纹理贴图,会让渲染效果非常逼真...

  • 基础纹理

    存储在每个顶点上。纹理映射坐标定义了该顶点在纹理中对应的 2D 坐标。通常,这些坐标使用一个二维变量(u, v)来...

  • Ⅱ基础纹理

    基础纹理 单张纹理 关于纹理导入设置用途知识跳转至https://docs.unity.cn/cn/current...

  • 《Unity Shader入门精要》| 读书笔记(三)

    继续来看纹理! 第7章 基础纹理 普通纹理 纹理映射:用一张纹理贴图来代替物体的漫反射颜色,漫反射颜色类似于绘画里...

  • OpenGL 数据处理(下)

    1 纹理基础 纹理是一种结构化的存储形式(Textures are a structured form of st...

  • OpenGL 基础纹理

    原始图像数据 像素包装 图像存储空间 = 图像的高度 * 图像宽度 * 每个像素的字节数。 OpenGL中的纹理文...

网友评论

    本文标题:008-基础纹理下篇

    本文链接:https://www.haomeiwen.com/subject/tfhzkktx.html