游戏开发入门 三、图形渲染

游戏开发入门(三)图形渲染笔记:

渲染一般分为离线渲染与实时渲染,游戏中我们用的都是实时渲染。

1.实时渲染又可以分为2D渲染与3D渲染。
        早期的2D渲染,是通过把一块内存(图片像素数据)往另一块(显示缓冲区)上搬运的方式,实现图片绘制的。

        不过现在很多2D渲染的渲染方式已经采用3D渲染了。原因是当前显卡从架构上就利于并行处理,绘制速度更快,可以很方便提供各种3D效果,还节省图片资源内存。

        3D的渲染简单概括一下,就是把一个空间中的模型所有点的数据取出来,经过空间转换到2维屏幕上,然后根据各项参数与数据在绘制到屏幕上。

        现在几乎所有的游戏都是使用3D的渲染流程。

2.3D渲染中基本单位就是顶点,顶点数据信息包括如下

        位置(相对模型位置)
        颜色(可有可无,可以在后面再处理)
        法线(主要是用于光照计算,可以知道哪边是背光)
        骨骼权重(一个点可能跟随多个骨骼运动)
        贴图UV
3.MipMap 一般自动生成,远处的角色自动使用小的贴图,减少不必要的开销
        MipMap生成时由于边缘问题可能产生混色,所以一个贴图明显不同的地方可以留几个像素

4.DX 微软的图形编程API,着色语言是High Level Shader Language(HLSL),只能在Windows使用
        OpenGL(OpenGraphicsLibrary) 着色语言是OpenGL Shader Language(GLSL)跨编程语言,跨平台

5.DX8与OpenGL2.0以后就都支持可编程渲染管线
        vertexShader与pixelShader。现在更新的版本还支持GeometryShader

6.ES2.0管线流程
        顶点buffer数据——Vertex Shader——PrimitiveAssembly(图元装配)—— 【如果有的话        GeometryShader】 Rasterization 光栅化——Fragment Shader(即Pixel Shader)——        PerFragementOperation——FrameBuffer

7.ES2.0管线简述
        Vertex Shader
        顶点变换 移动,旋转,缩放,坐标系转换,投影变换
        光照计算 做法线变换和法线规格化
        纹理坐标转换 修改UV,偏移缩放等

        PrimitiveAssembly
        支持点,线,三角形三个图元
        三角形需要根据三个顶点装配成一个三角面
        执行裁剪,可以选择完全剔除,正面剔除或背面剔除(有些透明物体的渲染不剔除)

        GeometryShader
        对一组已经组成图元的顶点进行处理,可以改变图元类型和个数

        Rasterization 光栅化
        把一个矢量三角形变成一个位图图像(填充像素),每个顶点之间会通过颜色数据自动进行插值。

        Fragment(Pixel) Shader
        得到的是片元信息,即每个像素的深度颜色等,可以修改颜色也可改变像素的深度(z-buffering)。
一个Pixel Shader不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状

        PerFragementOperation 片段测试,进一步筛选出不必要的信息,具体测试流程如下:

        Pixel ownership test:测试该像素用户是否可见是否被其他窗口遮挡
        Scissors Test:裁剪测试,判断是否在定义的裁剪区域内
        Stencil Test:模板测试,决定了像素的颜色值是否要被写入到渲染目标 这个有点像PS里面的遮罩,相当于我用一个锅把桌子盖住,盖住的部分不渲染
        Depth Test:深度测试,就是距离摄像机近裁剪面的距离,剔除深度高的
        Blending:混合,对于特殊的材质(比如玻璃等半透明物体)
        Dithering:抖动显示,就是用少量的颜色来表现更广泛的颜色的,可以到wiki上查一下https://en.wikipedia.org/wiki/Dither
        FrameBuffer:最终的渲染数据
8.HDR基本原理
        高动态范围图像(High-Dynamic Range),从表现上可以提供更高的色深、更广的动态范围和更强的色彩表现力,经常用来调整曝光。

        基本原理:现实最亮的物体亮度和最暗的物体亮度之比为10^8,人的肉眼识别的亮度信息只有10^5左右。但是显示器表示256种亮度。
所以问题就是一般我们的显示设备的亮度跨度过大(而且人眼对不同亮度的敏感度也不同,参考伽马校正 https://en.wikipedia.org/wiki/Gamma_correction),所以需要一套校正显示器显示的系统,可以简单理解为HDR。

9.为什么一个角色的衣服要在多个帧去渲染?
        因为不同位置的材质可能不同,其管线中的vertexshader等处理也可能不同,所以要分开绘制。

10.常见的渲染效果

        全局光照:解决的核心问题就是如何很好地表现物体间的相互反射问题,最直接的问题就是如何找到一种更合理的方式来取代局部光照中的ambient(环境光),有多种实现方法,例如辐射度、光线追踪、环境光遮蔽(ambient occlusion)、Light Probe等
阴影:比较流行的主要是shadow mapping和shadow volume。
        shadow mapping基本原理是场景的深度渲染到一张深度缓冲区中,我们可以在场景中获得一张阴影或者无阴影的贴图,然后用这个深度图进行渲染。
        Shadow volume基本原理是根据光源和遮蔽物的位置关系计算出场景中会产生阴影的区域(shadow volume),然后对所有物体进行检测,以确定其会不会受阴影的影响。
扭曲:把一定范围的像素的UV进行扭曲
11.后处理
        相当于对渲染完成后图片的处理,这个是对像素进行处理的,不在渲染管线的流程里面

        AO:环境光遮蔽,描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,基本原理就是物体相交位置的深度不同,深度大的位置就变暗。现在游戏中比较常用的还有一个SSAO。

        模糊:有高斯模糊,径向模糊等,基本原理就是对一定范围的像素点的颜色进行平均混合操作。

        景深:Z值高达一定值就行像素虚化

        辉光(光溢出):某一点的颜色会扩散到他附近的屏幕空间,可以首先进行一次模糊处理,然后对模糊后的图片与原来的图片进行Alpha混合。

12.材质、贴图、纹理:

        整个 CG 领域中这三个概念都是差不多的,在一般的实践中,大致上的层级关系是:

        材质 Material包含贴图 Map,贴图包含纹理 Texture。

        纹理是最基本的数据输入单位,游戏领域基本上都用的是位图。此外还有程序化生成的纹理 Procedural Texture。

        贴图的英语 Map 其实包含了另一层含义就是“映射”。其功能就是把纹理通过 UV 坐标映射到3D 物体表面。贴图包含了除了纹理以外其他很多信息,比方说 UV 坐标、贴图输入输出控制等等。

        材质是一个数据集,主要功能就是给渲染器提供数据和光照算法。贴图就是其中数据的一部分,根据用途不同,贴图也会被分成不同的类型,比方说 Diffuse Map,Specular Map,Normal Map 和 Gloss Map 等等。另外一个重要部分就是光照模型 Shader ,用以实现不同的渲染效果。



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值