OpenGL--纹理问题记录

纹理的基础知识请参阅LearnOpenGL的文章:
https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/

这里记录一下自己在使用纹理时候遇到的一些问题。

纹理图像大小,2的n次方?

自己在查阅有些资料的时候,有些人在博客上写了这样的话:

OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件,这个纹理图片才是有效的。

可能是博客时间的问题,只有在OpenGL2.0以下的版本,纹理的高度和宽度才必须为2的n次方大小。

知乎问题:OpenGL es2.0之后对要渲染纹理的尺寸大小不限制2的次冪了吗
叛逆者的回答:3.0才不限制。2.0还是需要判断是否有GL_OES_texture_npot这个扩展。
查询扩展的方法glGetString(GL_EXTENSIONS), 看返回的字符串里有没有GL_OES_texture_npot

纹理环绕

纹理环绕方式如下图:

之前在介绍blend的时候说到了,在使用blend的时候,需要将源颜色图像(传入的纹理)的环绕方式换为:
- GL_CLAM_TO_EDGE
- 或者GL_CLAM_TO_BORDER
防止由于使用GL_REPEAT的时候纹理的边缘部分插值而出现半透明的效果。

纹理过滤–各向异性纹理过滤

在执行纹理过滤操作时,正在使用的纹理一般会被放大或缩小,换句话说,就是纹理被贴到比它大或比它小的图元上。纹理放大会使多个像素映射到一个texel,得到的图像可能会有马赛克。纹理缩小会使一个像素映射到多个texel,得到的图像可能会模糊不清或有锯齿。

各向异性过滤是最新型的过滤方法,它需要对映射点周围方形8个或更多的像素进行取样,获得平均值后映射到像素点上。对于许多3D加速卡来说,采用8个以上像素取样的各向异性过滤几乎是不可能的,因为它比三线性过滤需要更多的像素填充率。但是对于3D游戏来说,各向异性过滤则是很重要的一个功能,因为它可以使画面更加逼真,自然处理起来也比mipmap过滤会更慢。

参考资料
如果使用一般的纹理过滤,当观察方向跟模型表面不是相互垂直的的情况下,会出现纹理信息的丢失,表现为图像看上去比较模糊,如下图所示,远处场景的细节信息很差:

针对这种情况,可以采用各向异性过滤的方式处理纹理,在过滤纹理的时候,考虑到观察角度不同,使纹理本身沿着模型表面倾斜的方向进行延伸。

使用如下语句查询当前系统支持的最大各向异性过滤的数值,数值越大,表示沿着最大变化方向所采样的纹理单元越多,显示效果就越好:

GLfloat max_TexAni;    //查询允许的各向异性数量  
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_TexAni);  
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_TexAni);  

效果图:

你可能感兴趣的:(OpenGL)