文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。
本系列原更新于作者的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. ARM7与GSM实现的简单的远程控制

    幸好单从控制GSM上来说,并不是太难,它是基于串口通信的,而且全是基于AT指令的控制,说起来,就只是熟悉下指令,而且这次比赛用到的指令也比较少,主要是关于短消息方面的指令.我们用到的指令如下: AT& ...

  2. HTTPS 通讯流程

    原文地址 https://blog.csdn.net/wangweilica6/article/details/50171457 一.简介 前一篇文章,我总结了下,如何部署https服务,开通ssl通 ...

  3. 31、cookie小test

    请尽量使用JQuery进行代码编写,需求如下: 1.  页面初始化样式如图 2. 顶部input框中输入内容,按下回车enter键后,“正在进行” 列表中加入该条内容.   3. 顶部input框中输 ...

  4. elk-(七)

    最终架构确定为  logs--->blieb--->redis/kafka--->logstash--->es--->kibana 注意:  geoip下载地址: wge ...

  5. java.sql.SQLException: Field 'id' doesn't have a default value(用eclipse操作数据库时报了这种奇怪的错误)的原因与解决方法

    1.错误原因 由于id在数据库表中是作为主键,但是在插入的过程中,没有给予数值,并且没有让其自增 2.解决办法 修改数据库表中的id,让其自增(在插入的过程中,不插入id数据时)

  6. 剑指offer——python【第28题】数组 中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  7. GC垃圾回收器

    java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”.jvm解决的两个问题:给对象分配内存以及回收分配给对象的内存.GC:将内存中不再被使用的对象进行回收.GC的作用域是JVM运行时 ...

  8. python入门以及接口自动化实践

    一.Python入门必备基础语法# 标识符:python中我们自己命名的都是标识符# 项目名 包名 模块名# 变量名 函数名 类名# 1:字母 下划线 数字组成 命名的时候不能以数字开头# 2:见名知 ...

  9. linux命令: 两个查找工具 locate,find

    linux 中有很多查找工具,今天主要讲解locate,find两个工具. 1.locate (1)查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 注意:如果这 ...

  10. 安装php后无法动态加载库

    安装Apache.mysql.PHP并配置完成后使用phpinfo测试显示正常,但是无法动态增加库 原因:安装PHP后不会生成php.ini文件,但是phpinfo测试正常 解决方法: 1.查看配置文 ...