zoukankan      html  css  js  c++  java
  • 【如果我是面试官】系列(二):渲染

    原地址:http://www.unity蛮牛.com/forum.php?mod=viewthread&tid=19431&highlight=%E5%A6%82%E6%9E%9C%E6%88%91%E6%98%AF%E9%9D%A2%E8%AF%95%E5%AE%98

    面对初级程序员,对渲染流程方面的知识应该浅尝辄止的提问,除非应聘的公司是要自研引擎的。其实玩项目的,多半渲染和图形学也是二把刀,估计谙熟一下这些sb5上的基本问题,会好受一些。。。当然也好受不了多少哈。
    渲染:
    1.请简述Opengl渲染流程(渲染管线流程。。。。)
    这里的所谓管线,就是流程的意思。也没什么好说的,一个装逼词汇而已。随便百度一下渲染管线,大概就能知道那几个高深莫测的名词,为了方便大家理解,我给翻译成人话,希望大家能理解。。。

    顶点变换(你那个模型,不是个模型对吗,是个三维的立体的是吧,但是你屏幕是二位的,你想到怎么解决这个问题了么,把三维的东西搞到二维上?这就是顶点变换的最终目的。在这里大量会用到矩阵计算,因为矩阵计算这个东西,会构造出很多“巧合”,最著名的巧合,就是MVP矩阵,这是模型-视图-投影矩阵,是三个矩阵的乘积而已,如果大家到这里就作呕了,那么仅需要了解一下MVP矩阵,都是什么即可,哪个矩阵是降维的。如果还有点能力,希望去了解一个关键字叫:透视除法,基本就过关了)

    【在顶点变换的时候,会经常提到一个词:顶点着色器。需要注意的就是,有几个顶点,这个就会运行几次,这个东西水很深。如果有兴趣了解的朋友,可以去入一下cg教程,上边很详细的写了各种基本的顶点信息。顶点光照等内容,这里篇幅太小了,本人水平也优先,不比比了。。】

    图元装配(现在你的顶点已经转化成了二维平面上的点,那么把它们按照一定顺序连接起来,就叫图元装配。其中大名鼎鼎的三角带三角扇,就是这时候搞出来的。)

    光栅化(你的三维模型经过了顶点变换已经投影到了二维平面上,而且被装配程图源了,对吧,但是你的屏幕是一个一个细细小小的像素格子组成的,对于一个图片,电脑是怎么知道应该把它搞到哪几个像素上去显示的呢?这就是光栅化。说白了就是,把你想看见的图片,搞成像素能显示的。光栅化工作告诉了显卡,哪个格子是你这个图形应该画上的,哪个不是,就这么简单)

    颜色填充(你光栅化之后的每个小格子,都不能白放那搁着,要搞上颜色才对,注意的是没法将一个格子一半涂成白色一半涂成黑色。。所以我们追求高像素屏幕,像素越高,效果越好,正是这个道理)

    【在颜色填充的时候,又会提到一个词:fs,像素着色器,也叫片段着色器,需要注意的是,有多少像素,他就运行多少次。。对没错,是像素。。细细密密的,一个小格子,,它就会执行一次。。它就是负责给每个像素上色的!!!水超级无敌大坑逼一般的深。。它是渲染的心脏,也是引擎中最璀璨的明珠。大家可以编写fs来简单的玩一玩这个。不说了想多了解还是看cg教程和sb5】

    各种测试(这时候你的一个图形已经画好了,但是你一定还有许许多多的图形,它们前后遮挡关系不一样,透明度不一样,这时候就搞一下深度测试,阿尔法测试等。这是引擎内部搞的,牵扯到剔除不渲染的物体这种复杂的算法,sb5上的例子是很好的,一个花托,关闭深度测试之后的现象是什么样子的,有兴趣的可以下载sb5的电子书和demo来看。。)

    具体就这么多,这个问题希望大伙别较真,稍微说出一点即可。。要是真当场让你写个fs实现某个效果,完全可以俩手一摊说百度上有我没写过。。另外你会给我多少钱?~~~

    2.mipmap和lod
    mipmap这个东西在二维比较常见,三维通常会用到lod。这两个词汇看着挺装逼,一说准明白。
    mipmap:这是处理一个图像在无限缩小时候的失真情况所准备的。根据GL上的接口可以看出来,这一切都是电脑帮你完成的。你用一张跟中国版图一样大的图片,放到你心爱的iphone上显示,那会挤成一团瞎噶哒对吗。这时候你会想,把960万平方公里的图片缩小一半,再看看。结果你会看到,还是瞎嘎达,你一直缩小一半,终于发现缩小到跟iphone大小一样,就不会瞎了。这就是mipmap。分级别搞图片,为了解决图像无限缩小(960w平方公里的图片相对于你iphone手机来说,那就是无限缩小),引起的失真问题。

    Lod:这个再unity中会直接用到,你距离一个人很远,看到那个人的轮廓而已,我凭啥把高模放那让你看?高模很废资源的!所以我会搞一张图片让你看个轮廓~(这是最低级别),你距离一个人中等远,看到那个人手里的武器,看到那人是男是女而已,我凭啥把高模放那给你看?所以我会搞一个低模让你看个大概(这是中级级别),当你距离一个人很近,你能看见他的眉毛眼睛鼻子嘴这些细部,那我不得不放个高模给你看(这是最高级别)。一般unity中的lod,大概就会分这些级别,不过很不好意思,lod分几个级别,美术兄弟就得做几套资源给你,并不是mipmap那种电脑帮你一把搞定的。

    3.phone光照和高式光照。
    这个问题也是经常被问的。其实光照这个概念本身也是很玄幻——咱不说别的,你用一个手电筒打在一个石膏球上,用相机拍下来,你会发现这个石膏球本来颜色都一样,被手电筒照了之后,颜色会不一样!(高光地方和低光地方的rgb颜色是不同的,你的脑子可能帮你过滤掉了,但是机器智能根据rgb来判定颜色)这就是为什么光照对于渲染来说,是很重要的一个参数。

    凤模型和高模型最大的区别便在于,一个是顶点时候给予光照计算的,一个是片段时候给予光照计算的。效果也是不太相同的。具体可以去查sb5.来看看有什么不同。

    另外可能还会提到一个词叫blinphong,这个东西跟phong差不多,但是用到了一个半角向量。水不是很深这一块,稍微百度了解个梗概即可。需要看我这篇文章的,基本到这就可以了。。。

    4.法线贴图的切空间。
    这个问题是非常狗的一个题,你先要知道,什么是法线贴图,dumpmap之类的、。这显然不是一弯浅水。。法线贴图呈现为蓝紫色,这个怎么生成的你不用管,是美术搞的,他们有插件可以无脑搞。问题就是怎么用,什么原理。

    法线贴图这个东西是一个“取巧”的做法。一张图上,每个像素,都有rgb信息对么,一般图用它来存储红绿蓝三原色的比重,这样你看到是一张bitmap,普通图(这里的图跟迪杰斯特拉那个什么图毫无关系。。就是图片而已,不要懵啊。。)但是法线贴图,用这三个值存的是:这一点,模型法线的xyz!它经过一个数学变换,把范围搞到了0-255这个区间之内,存到了一张图上。

    或者可以理解法线贴图为:一张存着每点法线的数据表。

    既然是一张数据表,我是怎么用的呢?别着急,这数据表上存的“法线”是独立的一个空间,说句白话,就是一根法线一套xyz坐标,数据表上的数,便是这根法线在这套xyz坐标之内的三维坐标。这套xyz坐标,便是大名鼎鼎的 切空间。 如果你想了解为什么这么狗,请自觉查阅cg教程,它很详细的讲了为什么会这么做,因为法线贴图是dumpmap“演变”而来的。有了我这点潦草的铺垫,读那个感觉会更舒服一些?

    5.基本shader的编写。
    所谓shader就是上文中说的顶点着色器(vs)和片段着色器(fs)举个最简单的例子吧,你要是想给全部都弄成灰色,怎么办?当然是挨个像素搞一遍了,于是你要在片段着色器里写东西,把每个像素都搞成灰色即可。这时候顶点帮不了你忙了。可能你好奇,我给个三角形,我三个顶点取三个截然不同的颜色,会发生什么?你想难为一把电脑?它可不吃这一套,它会均匀插值布满你这个图元(就是图元装配那个图源)的,所谓插值,可以理解为,过渡。。。如果你想在shader中写一个动态的什么玩意,比如水波,那么肯定会跟时间打交道,因为图是随着时间变化而变化的。这就有些难了,大体思路就是这样,如果你看shader中有很多匪夷所思的公式,算法,不要惊慌,在cg和sb5上都能找到他们的源公式,只不过是变形了而已。这里主要问题就在于几个光照模型的公式,数学技巧等(这些回来想单独搞一个什么图形学入门帖子。。。)这里就不废话了。

    搞到单位十一点多,该走了,多谢艺术总监大哥陪我到现在,哈哈哈,希望对大家有帮助哈。

  • 相关阅读:
    ffmpeg常用命令集合
    Django传文件(FILES用法)
    Flask传文件(files用法)
    docker 部署redis服务
    tomcat启动报错ContainerBase.addChild: start
    Echarts折线图 y轴刻度数值与实际值不符解决方法
    春招日记
    Leetcode5700. 使所有区间的异或结果为零(DP)
    VS2015拖动调整代码窗口奔溃
    图床搭建
  • 原文地址:https://www.cnblogs.com/123ing/p/3851264.html
Copyright © 2011-2022 走看看