0.1:Why are We Addicted to Games
文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。
本系列原更新于作者的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的更多相关文章
- css隐藏元素display:none,opacity:0;filter:alpha(opacity=0-100;,visibility:hidden的区别
在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.我们一般有三种方式:display:none, opacity:0;fil ...
- SignalR 2.0 系列: 开始使用SignalR 2.0
这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第四篇:开始使用SignalR 2.0 原文:Getting S ...
- Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋
Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始
- [渣译文] SignalR 2.0 系列:SignalR的高频实时通讯
原文:[渣译文] SignalR 2.0 系列:SignalR的高频实时通讯 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...
- [渣译文] SignalR 2.0 系列: SignalR 自托管主机
原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...
- [渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0
原文:[渣译文] SignalR 2.0 系列: 开始使用SignalR 2.0 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP ...
- [渣译文] SignalR 2.0 系列: 支持的平台
原文:[渣译文] SignalR 2.0 系列: 支持的平台 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ASP. ...
- [渣译文] SignalR 2.0 系列: SignalR简介
原文:[渣译文] SignalR 2.0 系列: SignalR简介 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ...
- .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧
原文:.Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 最近看到博客园入门教学文章比较流行,自己最近又偷懒比较多,没啥心得,不妨写一篇没啥深度的入门文章吧. 话说有了WebB ...
随机推荐
- Linux下的at定时执行任务命令详解
之前说了使用crontab实现定时执行任务,假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了.一.at服务 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下 ...
- cf 893 E
有 次询问,第 次询问包含两个数 . 求满足下面两个要求的 数组的方案数. 1. 数组由 个整数构成 2. A与B不同当且仅当至少存在一个数 满足 .答案对 取模 数据范围: 显 ...
- postgresql数据库和mysql数据库的对比分析
1.Posgresql是进程模式,多进程,单线程,类似的还有Oracle.而MYSQL采用的是线程模式,单进程,多线程,对此,大家在运行数据库的时候可以查看任务管理器,SQL Server也是如此. ...
- Strassen 矩阵相乘算法(转)
偶尔在算法课本上面看到矩阵相乘的算法,联想到自己曾经在蓝桥杯系统上曾经做过一道矩阵相乘的题目,当时用的是普通的矩阵相乘的方法,效率极低,勉强通过编译.所以决定研究一下Strassen矩阵相乘算法,由于 ...
- 1、js基础内容
js基础内容 1. 编辑器 编译环境 浏览器 编辑软件 sublime DW H5Build Atom ==[注]尽可能多的去使用编辑器去编辑代码.== Html+css ==JS 逻辑== 比作建设 ...
- Wooden Sticks---(贪心)
Problem Description There is a pile of n wooden sticks. The length and weight of each stick are know ...
- java Api 读取HDFS文件内容
package dao; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java ...
- mui 弹窗提醒,form表单基本信息
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- python——shopping car
# _Author:huang# date: 2017/11/26 # 简单的购物车程序money = input("money:") product_list = [ (&quo ...
- python全栈开发 * 进程池,线程理论 ,threading模块 * 180727
一.进程池 (同步 异步 返回值) 缺点: 开启进程慢 几个CPU就能同时运行几个程序 进程的个数不是无线开启的 应用: 100个任务 进程池 如果必须用多个进程 且是高计算型 没有IO型的程序 希望 ...