opengl交互式图形设计报告如何在不清除已经画出的图形的情况下,实现另一个图形的移动?

好久没在知乎上认真写答案了,刚好最近半年时间的主要工作就是基于WebGL的渲染引擎的开发,所以可以简单分享我的看法。

首先想说的是引擎和图形API的关系,图形API相对于引擎来说是工具,所以说渲染引擎的核心不会是工具,而是如何用工具设计出相应的功能,因此我觉得API只需熟悉即可,熟悉的程度大致是了解每个API的功能,基本用法,并且对相应的开销有一个大致的概念。至于细节可在用的时候查工具书或者文档。譬如我现在基于WebGL2.0的标准开发,这部分的资料比较少,但可以大致对应到OpenGL ES3.0的API特性,因此可以基于OpenGL ES3去了解WebGL2,这里推荐一本书:《OpenGL ES 3.0编程指南》,目前应该是第二版,作为工具书非常实用。

对API的学习和了解可以是渐进式的,核心还是在于图形学的算法和你在引擎开发之初希望你的引擎是什么样的,拥有什么功能,核心优点是什么,根据功能需求再去选取API加以利用,所以多读图形学相关的PAPER,关注SIGGRAPH,GDC这些图形和游戏的顶会是更为重要的事,通过实现功能去理解API的设计思路和用法,往往体会更深入。譬如在学习图形之初,很多人都不理解Stencil Buffer,但是通过学习Shadow Volume的算法,就能比较深入的理解它,再譬如glsl中的discard命令(hlsl的clip)可以通过了解alpha test来学习。实时图形算法几乎都是基于现代的图形API来实现的,而这些图形API设计思路大同小异,通过了解这些算法的实现,也就同时了解了相应API的用法。

不同引擎因为设计之初的需求不同,因此可能在功能的规划上也有区别,不过总体来说都会有一部分核心功能大家比较相似,另外的高级功能和定制功能可能会有较大差别。

核心功能部分大概包含了基本的场景概念,场景的层次结构,摄像机,场景的遍历、剔除、光照、阴影、鼠标拾取、动画、材质系统、渲染结构的实现。

基本的场景管理部分是整个渲染数据架构的核心,一定程度决定了引擎渲染的方式,同时也很大程度决定了渲染在CPU端的提交效率,这部分可做的优化比较多,譬如用一些数据结构(BSP,OCTree)加速场景的遍历,视锥剔除,遮挡剔除,LOD,材质排序等都能够有效的提升引擎渲染效率,也是往往被忽略的部分,这部分在每年的相关会议上提的也比较少,叶老师翻译的《游戏引擎架构》和《3D

光照、阴影和渲染架构也是渲染引擎的核心功能,近年来延迟渲染(Deferred Rendering)是比较流行的渲染架构,在其基础上衍生出了Tile Based Deferred Shading以及更进一步的Clustered Shading,如果基于前向渲染则可以考虑Forward+的技术;在光照模型方面,近年来大家已经不同程度趋向于基于物理的渲染(PBR),从2012年左右开始在各大会议上每年都有相关议题的分享;阴影也是非常重要的功能,主要的问题是阴影质量、软阴影的模拟、多阴影的管理和阴影性能几个方面,比较重要的几个成果包括PSSM,SDSM(旨在提升阴影质量),Variance Shadow Map(旨在模拟软阴影),《Real Time shadows》这本书对于阴影技术有一个详细的汇总,至于多阴影和阴影性能方面,则需要通过阅读一些商业引擎在阴影方面的具体实现来找到灵感,这里推荐toughBro博客里的一篇导读及其原文:

;动画部分也是较大的课题,不过每年也都有文章提及,内容较杂,比较重要的动画类型包括骨骼动画和Morph动画,以及结合物理引擎的RagDoll(实际上也是骨骼动画)。


高级功能
或许称之为扩展功能更恰当,这部分功能并非必要,实现也依据引擎特点各有不同,主要是为渲染效果加分,用于渲染一些特殊的材质和效果或者后处理特效,比较重要的特殊材质包括半透明物体的渲染(depth peeling,alpha to coverage,per pixel linked list),水体的渲染(Simulating Ocean Water,Jerry

其它部分就是一些细节的优化了,这部分细节更多,零零星星也有一些资料,暂时就不赘述了。

以上大概是我能想到的一些内容,等有空的时候可以再整理文章的引用和资料补全。

这篇文章总结一下图形学在游戏开发工程师面试时常考(可能会考)的问题。虽然图形学在面试中的比重比较小,但是还是要复习一下的。图形学的考点分为三部分,一是渲染管线,二是数学尤其是线性代数和三维几何。

四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢?
在Unity里,tranform组件有一个变量名为rotation,它的类型就是四元数。很多初学者会直接取rotation的x、y、z,认为它们分别对应了Transform面板里R的各个分量。当然很快我们就会发现这是完全不对的。实际上,四元数的x、y、z和R的那三个值从直观上来讲没什么关系,当然会存在一个表达式可以转换。

1.16 四元数、欧拉角、旋转矩阵的优点和缺点

Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。这里有个视频可以直观的理解下;


1.17 多级渐近纹理 mipmap?有什么优缺点?

为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap
多级渐进纹理由一组分辨率逐渐降低的纹理序列组成,每一级纹理宽度和高度都是上一级纹理宽度和高度的一半。宽和高不一定相等,也就是说,这些纹理不一定都是正方形。
优点:提高渲染速度,减少图像锯齿
缺点:会增加额外的内存消耗

1.18 片段和像素的区别 ?

  1.  片段是渲染一个像素需要的全部信息,所有片段经过测试与混合后渲染成像素。
  2. 片段是三维顶点光栅化后的数据集合,还没有经过深度测试,而像素是片段经过深度测试、模板测试、alpha混合之后的结果
  3.  片段的个数远远多于像素,因为有的片段会在测试和混合阶段被丢弃,无法被渲染成像素。

  1.     需要一个空间保存每个像素的深度,绘制前初始化所有深度为无限远,绘制时当前片段如果比zbuffer中的值大(说明更远),则跳过此片段,保留原来的渲染结果;否则,绘制此片段,并更新zbuffer。

2.1 平面上N个点,每两个点都确定一条直线, 求出斜率最大的那条直线所通过的两个点
平面上N个点,每两个点都确定一条直线,

求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。

平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。
关于这道题,网上已经给出了解答要点:
3个点A,B,C,把它们的按x坐标排序。假设排序后的顺序是ABC,那么有两种情况:

其中k()表示求斜率。
所以程序的基本步骤就是:

先把这些点按x坐标从小到大排序,斜率最大的两点必然是挨一起的两个点,所以排序O(n* lg n),遍历一次O(n)就够了

我要回帖

更多关于 opengl交互式图形设计报告 的文章

 

随机推荐