文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。
本系列原更新于作者的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. Kafka consumer poll(long)与poll(Duration)的区别

    最近在StackOverflow碰到的一个问题,即在consumer.poll之后assignment()返回为空的问题,如下面这段代码所示: consumer.subscribe(Arrays.as ...

  2. crt sqlplus 中文乱码解决方案:

    1.确定数据库字符集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') ----------------------- ...

  3. Abp之工作单元与事务

    环境:Abp1.2 疑问:没有调用工作单元的SaveChanges方法引起的事务提交时机的问题. 例如:有一个应用服务代码如下: public void CreatePhrase(PhraseCrea ...

  4. rabbitmq - java client lib一二事

    由于不可抗因素, 需要给对接方撸一个client的demo.基于比较老的jdk. 所幸找到了这里:http://www.rabbitmq.com/releases/rabbitmq-java-clie ...

  5. centos 安装python PIL模块

    转载:https://www.cnblogs.com/ccdc/p/4069112.html 1.安装 使用yum安装缺少类库: #尤其重要,否则会报错 yum install python-deve ...

  6. bootstrap滚动监视原理实现

    最近在公司实习,刚好写了一个静态的网页,用到了滚动监视,就自己写了个监视,话不多说直接进入正题 $(function () { var $root = $("html,body") ...

  7. 手把手教你提交文件到git

    手把手教你使用git提交到github 作者 数据分析与优化 关注 2016.07.17 10:25 字数 7342 阅读 399评论 1喜欢 6 摘要Git是分布式版本控制系统,那么它就没有中央服务 ...

  8. Codeforces 1090D - Similar Arrays - [思维题][构造题][2018-2019 Russia Open High School Programming Contest Problem D]

    题目链接:https://codeforces.com/contest/1090/problem/D Vasya had an array of n integers, each element of ...

  9. Codeforces 1062 - A/B/C/D/E - (Undone)

    链接:http://codeforces.com/contest/1062 A - Prank - [二分] 题意: 给出长度为 $n(1 \le n \le 100)$ 的数组 $a[1 \sim ...

  10. aop execution 表达式解析

    execution(* com.sample.service.impl..*.*(..)) 解释如下: 符号 含义execution()表达式的主体:第一个”*“符号表示返回值的类型任意:com.sa ...