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

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

最邻近点采样(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 面试题,很多人第一题就答不好

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种方式:

  • 高斯模糊(或者线性模糊)
  • 多重采样

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

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

多重采样抗锯齿实现主要是通过构建一个多重采样渲染缓冲区(多重采样纹理)作为颜色附着的帧缓冲区,详细实现方式参考:一文搞懂 OpenGL 多重采样抗锯齿,再也不怕面试被问到了

— END —

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

字节流动

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/48087.html

(0)

相关推荐

发表回复

登录后才能评论