当前位置: 欣欣网 > 码农

几道常见的 OpenGL 面试题,很多人第一题就答不好

2024-05-10码农

说说纹理常用的采样方式?

最邻近点采样(GL_NEAREST)和双线性采样(GL_LINEAR)。

GL_NEAREST 采样是 OpenGL 默认的纹理采样方式 ,OpenGL 会选择中心点最接近纹理坐标的那个像素,纹理放大的时候会有锯齿感或者颗粒感。

GL_LINEAR 采样会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。

一个纹理像素的中心距离纹理坐标越近,那么这个纹理像素的颜色对最终的样本颜色的贡献越大。因为与周围的像素做加权平均了,纹理放大的时候会变模糊。

当进行放大(Magnify)和缩小(Minify)操作的时候可以设置纹理过滤的选项,比如你可以在纹理被缩小的时候使用邻近过滤,被放大时使用线性过滤。

我们需要使用glTexParameter*函数为放大和缩小指定过滤方式。这段代码看起来会和纹理环绕方式的设置很相似:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

什么是 EGL ?

EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口 ,它的主要作用:

  • 与设备的原生窗口系统通信;

  • 查询绘图表面的可用类型和配置;

  • 创建绘图表面;

  • 在OpenGL ES 和其他图形渲染API之间同步渲染;

  • 管理纹理贴图等渲染资源。

  • OpenGL ES 的平台无关性正是借助 EGL 实现的,EGL 屏蔽了不同平台的差异

    本地窗口相关的 API 提供了访问本地窗口系统的接口,而 EGL 可以创建渲染表面 EGLSurface ,同时提供了图形渲染上下文 EGLContext,用来进行状态管理,接下来 OpenGL ES 就可以在这个渲染表面上绘制。

    纹理有哪些环绕方式(Wrapping)?

    环绕方式(Wrapping) 描述
    GL_REPEAT 对纹理的默认行为。重复纹理图像。
    GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。
    GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。
    GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色。

    当纹理坐标超出默认范围时,每个选项都有不同的视觉效果输出。我们来看看这些纹理图像的例子:

    OpenGL ES 不支持 GL_CLAMP_TO_BORDER

    设置方式:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

    锯齿问题怎么优化?

    主要有2种方式:

  • 高斯模糊(或者线性模糊)

  • 多重采样

  • 高斯模糊(或者线性模糊)主要作用是在锯齿的边缘加一些过渡,让边缘看起来更平滑。

    多重采样抗锯齿是使用多个采样点来决定一个片段的颜色,使边缘的过渡更加平滑。

    多重采样抗锯齿实现主要是通过构建一个多重采样渲染缓冲区(多重采样纹理)作为颜色附着的帧缓冲区,详细实现方式参考:

    -- END --

    进技术交流群, 扫码添加我的微信:Byte-Flow

    获取相关资料和源码

    学习音视频、OpenGL ES、Vulkan 、Metal、图像滤镜、视频特效及相关渲染技术的付费社群,面试指导,1v1 简历服务,职业规划。

    我的付费社群

    推荐: