文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。
本系列原更新于作者的github博客,这里给出链接

前言

本系列仅用于记录并分享自己的学习过程,以及学习过程中遇到的问题,如有错漏,欢迎讨论。(第0章是Shader系列的引导部分,已经有计算机图形学基本认识、游戏开发基础知识、Unity基础的可以选择性跳过。)

引言

从冯诺依曼到现代计算机,从简单的计算结果呈现到丰富多彩的视觉体验,计算机总是在带给我们惊喜。而这一切,都离不开计算机图形学。

什么是计算机图形学?首先,随着硬件水平的发展,我们已经能够支持的最小显示精度是 Pixel (像素),但仅仅只有精度还远远不够,我们还需要配套的显示模式来发挥这一优势,所以,为了尽可能好地呈现画面,计算机图形学应运而生。既然我们已经知道了图像显示的最小单位,那么我们要做的就是如何把想要呈现的图像绘制到屏幕的一个个像素点上,也就是栅格化图像。简单来说,计算机图形学就是研究将图形转化为计算机显示器栅格形式的算法的科学。

游戏总是给我们带来最直观的计算机视觉盛宴,而在这背后,计算机为我们做了很多事情。假设现在我们在玩一款第三人称RPG游戏,主角就站在我们屏幕中间。对于这样一个简单的画面,在计算机内部是如何实现的呢?

首先,计算机的精度是有穷的,有穷意味着不连续,所以我们只能以简单的、足够小的平面去近似得到曲面的效果,在计算机中,通常以三角面或者四边形为最小的面元。我们以三角面为例,现在我们已经有了一个三角面,但我不知道它在哪,这个时候,我们需要一个三维坐标系来辅助定位这个面,有了坐标系,我们就知道了这个三角形三个顶点的坐标,但仅仅知道顶点位置还不够。我们还知道,物体是通过反射光来让我们看到的,所以,我们还需要一个光源,以及一个观测者(观测者即虚拟摄像机,呈现在屏幕前的图像就是他看到的)。现在已经有了观察者,被观察物体,还有光,是不是我们就可以“看到”图像了呢?对于现实世界来说,确实可以,但计算机不行,因为这些都是我们的假设,计算机所能理解的只有计算。所以,我们要“计算”出这个物体在哪,观察者才能看到。怎么计算呢?首先,虚拟摄像机会基于自己的“视角”在摄像机和物体之间铺上一张网格(因为计算机的图像是不连续的,所以不是铺上平面),视点和图像连线与网格的交点就是图像最终显示出来的样子,它对应着一个个的像素,这一个步骤,我们便形象地称为栅格化。现在已经知道了三角形基于屏幕的相对位置信息,只要按屏幕比例缩放便可以呈现出图像了。但仅仅是这样还不够,每一个步骤都必须等待上一步工作完成后才可以开始进行,这并不高效,为了解决这个问题,计算机渲染引入了流水线工作模式,在流水线上,每一个阶段都有特定的程序和硬件去执行,最后把数据统一发送给下一阶段,这也就是我们通常所说的 Render Pipeline (渲染流水线)。

现在我们知道了,屏幕画面其实就是顶点和片元的 Render (绘制,呈现,渲染)过程,这个过程本质上是一种信息转换。不可否认,视觉上的冲击是最直观的,在游戏上更是如此,这也是Arts drive us crazy的原因。

游戏渲染又有何不同?

游戏大家都不陌生,但游戏最重要的是什么?是最直接迅速的反馈,尤其是视觉反馈。这又更依赖于强大的渲染技术。但与一般的计算机图形绘制不同,游戏渲染更注重效率。由于性能瓶颈,我们永远也无法为玩家提供最优质的游戏体验,但我们可以有侧重地进行计算,也就是让计算发生在最值得计算的地方,或者,使用更高效,但并不一定完全正确的算法。可能大家会有疑惑,为什么不正确的东西也可以被推崇呢?在图形学领域有一句名言: If it seems right, it is. (如果他看起来是对的,那他就是对的。)这其实是在告诉我们,没有绝对的正确的渲染,只有看上去正确的,即便有,但如果它的代价很大,我们仍然会选择效率高的经验模型(如经典光照模型)去计算。这也是为什么我们偶尔会在一些游戏镜头中看到“穿帮”镜头,但这并不影响我们的游戏体验。

最后

相信大家都是被游戏的精美画面或者独特玩法所吸引,进而热爱游戏,希望接触游戏开发。如果是前者,那么可以更深入地了解游戏美术行业,乐在其中。


这里给出一个书籍资料目录:

《3D数学基础:图形与游戏开发》

《Unity Shader入门精要》

《Real-Time Rendering》

《GPU gems》

《Unity Shaders and Effects Cookbook》

0.1:Why are We Addicted to Games的更多相关文章

  1. css隐藏元素display:none,opacity:0;filter:alpha(opacity=0-100;,visibility:hidden的区别

    在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.我们一般有三种方式:display:none, opacity:0;fil ...

  2. SignalR 2.0 系列: 开始使用SignalR 2.0

    这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第四篇:开始使用SignalR 2.0 原文:Getting S ...

  3. Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋

    Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始

  4. [渣译文] SignalR 2.0 系列:SignalR的高频实时通讯

    原文:[渣译文] SignalR 2.0 系列:SignalR的高频实时通讯 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...

  5. [渣译文] SignalR 2.0 系列: SignalR 自托管主机

    原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...

  6. [渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0

    原文:[渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP ...

  7. [渣译文] SignalR 2.0 系列: 支持的平台

    原文:[渣译文] SignalR 2.0 系列: 支持的平台 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ASP. ...

  8. [渣译文] SignalR 2.0 系列: SignalR简介

    原文:[渣译文] SignalR 2.0 系列: SignalR简介 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ...

  9. .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧

    原文:.Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 最近看到博客园入门教学文章比较流行,自己最近又偷懒比较多,没啥心得,不妨写一篇没啥深度的入门文章吧. 话说有了WebB ...

随机推荐

  1. spring mvc接收ajax提交的JSON数据,并反序列化为对象

    需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...

  2. poj 2420

    太虚假了. 我为什么要手贱点开submission? 这道题两天之前被一个学弟A了. ? 我退役了. 其实就是爬山吧..好像有的题解还分方向什么的完全没必要吧. #include <iostre ...

  3. VS2015编译rtklib2.4.2

    准备工作 在VS2015下新建一个win32的dll项目(空项目) 把在github上下载的rtklib2.4.2里的src文件夹复制到刚刚建立的win32下 把src里的文件添加到项目里,其中头文件 ...

  4. thinkphp5中使用PHPExcel(转载)

    thinkphp5中可以使用composer来获取第三方类库,使用起来特别方便,例如:可是使用composer下载PHPMailer,think-captcha(验证码)等等…… 接下来说一下怎么使用 ...

  5. jqeury点击空白关闭弹窗

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. day16 十六、包、循环导入、导入模块

    一.包的概念 包:一系列模块的集合体.包通过文件夹管理一系列功能相近的模块 重点:包中一定有一个专门用来管理包中所有模块的文件 包名:存放一系列模块的文件夹的名字 包名(对象)存放的是管理模块的那个文 ...

  7. ELK之使用heartbeat监控WEB站点

    简介 无论您要测试同一台主机上的服务,还是要测试开放网络上的服务,Heartbeat 都能轻松生成运行时间数据和响应时间数据 Heartbeat 能够通过 ICMP.TCP 和 HTTP 进行 pin ...

  8. [No0000197]Windows用户都应该知道的运行命令

    通过"运行"命令,运行Windows丰富工具的方法.如果您知道工具或任务的相应"运行"命令,那么您就知道访问所述工具或任务的最快方法. 以下是我们最喜欢的Run ...

  9. Python3学习之路~5.10 PyYAML模块

    Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation

  10. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...