图形渲染基础学习

这篇具有很好参考价值的文章主要介绍了图形渲染基础学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文链接:游戏开发入门(三)图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客

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

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

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,偏移缩放等

这个阶段所接收到的数据则是每个顶点的属性特征,输出则是变换后的顶点数据

图形渲染基础学习,游戏引擎,游戏引擎架构

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.材质、贴图、纹理
(34 封私信 / 81 条消息) 贴图、纹理、材质的区别是什么? - 知乎 (zhihu.com)

一堂课学会shader笔记:

第一节课:
1.Shader分为两种:

vertex Shader(vs), Pixel Shader(ps)

2.在3D空间渲染中,一个贴图渲染其实与3D渲染相似,只不过他是有四个在一个平面的定点组成,把图的渲染(类似贴图) 信息取出来进行渲染。
拓展:传统的2D游戏,是通过把一块内存(图片)往另一块(显示缓冲区)上搬运的方式,实现图片绘制的,
渲染都是靠CPU的多媒体指令加速。举例来说,一个二维角色动画,可以通过制作其多个序列帧图片循环
播放来实现。所以我们需要保存多个图片资源,加载时间长还占用内存。
DX里面的Direct2D是在Direct3D基础上多出来的一层封装,借助Direct3D的功能实现了对底层硬件的直接访问
从使用的接口上是简化了直接使用Direct3D实现2D效果的一些复杂代码,因此可以认为效率和3d相同,而使用方法上更简单了
问:我们常见的UI的渲染走的是不是3D渲染管线? 是的。

3.问:vs函数不写shader也会执行?默认管线里面的顶点处理与shader里面的是什么关系?
答:默认可以不写shader,那么渲染管线就像传统管线一样正常输出。DX8与OpenGL2.0以后出现可编程渲染渲染管线,管线里面多出了VS与PS阶段。

4.问:默认vertex Shader都进行哪些操作?
答:vs默认就是处理顶点变换的,可以简单认为是将空间中的顶点坐标转为摄像机屏幕空间的顶点坐标,这里面涉及到多个转换。

5.Shader函数执行是通过GPU执行的,而且是并行执行每个顶点的每个函数。

6.问:顶点需要进一步进行图元装配变成三角形,图元装配怎么理解?在哪一步进行?
答:图元装配就是根据一定数量的顶点装配成可以渲染管线可以处理的基本图元。在顶点处理之后

7.三角形是最小的光栅化单元,光栅化简单理解就是把顶点数据“位图”化,从顶点转换为像素。
要确定三角形在屏幕占多少个像素点,光栅化时所有的像素是没有颜色的。需要从贴图里面拷贝 颜色信息。

8.PS函数,是针对像素来处理的,也是并行的。

9.注意两种投影 透视投影perspective 与 正交投影 orthography。
透视投影的过程简单理解就是,将一个视锥不断的压缩 ,得到的效果就是近大远小。正交投影就是无论从哪个位置看,大小都是一样的。

10.关于景深图
就是其Z值构成的,能也清晰的看到轮廓,原因就是一个Z值小的地方浅,边缘处 是其他物体Z值大。(0-1)

11.Z值深度应用

a.景深效果 Z值高达一定值就行像素虚化
b.SSAO 屏幕空间环境光遮蔽
发现如果当前位置与附近像素点的位置深度信息不同,深度大的位置就变暗

第二节课:
1.Render Texture(离屏渲染)

渲染结果不仅可以到屏幕,也可以到图片上。虚幻里面有一个RenderTarget,原理相同。

2.顶点处理MVP

Modeling Transformation(模型矩阵变换,模型点相对坐标转换到相对世界坐标,平移,旋转,缩放)
View(相对视角变换,世界坐标系一个点转换到摄像机坐标系里)
Projection(投影变换,挤压过程,比较复杂)
3.Shader里面最简单的变换就是MVP
将输入的顶点相对其模型的坐标,输出一个完成MVP变换的可以 与屏幕空间对应的二维坐标(结果是3维,另外两维可以认为无效)

4.DX9之前,渲染管线是几乎固定的,我们无法使用shader参与中间过程的渲染

5.对于某些顶点,我们直接返回其在屏幕上固定的坐标,可以实现类似UI的效果

6.VS函数可以用来处理蒙皮骨骼动画,根据权重处理渲染

7.CPU与GPU架构不同,互相不能访问显存与内容

8.CPU一开始会得到模型的顶点等数据,需要UpLoad到GPU,然后GPU去处理
这个UPload过程不能频繁进行,因为顶点数据是很多的,所以一般渲染时我们看到模型在变化,其实在CPU他的位置是没变的

第三节课:
1.BillBoard广告板的效果实现原理:
效果就是一个物体永远对着摄像机。原理是先做MV处理,在投影前把广告版强制沿着摄像机视窗平面展开
使图像一直对着摄像机,然后再做投影变化P处理。

2.shader传入的参数可以自己规定

3.图元装配细节
一个VertexBuffer作为顶点缓存,一个IndexBuffer作为索引缓存,然后索引缓存里面,每三个顶点对应一个三角形(顶点顺序不能反)

4.光栅化是一个有损的过程
把一个矢量三角形变成一个位图图像,每个顶点之间会通过颜色数据自动进行 插值。

5.UV
UV就是我们每个渲染顶点对应图片的坐标位置,渲染的时候需要根据当前顶点的UV数据去图片上找到对应的颜色信息。

6.采样
属于光栅化的一个步骤,就是上面描述的根据UV从图片对应位置取颜色信息

7.VS函数的输出就是PS函数的输入,PS函数输出的是颜色值

8.由于顶点的数量是有限的,PS得到的UV信息需要在VS里面经过插值处理

9.FilterMode

  • Point采样(只在指定位置采样)
  • Bilinear采样(附近4个位置采样)
  • Trilinear(两次,一次在精细图四个位置采样,第二次在小的图四个位置采样)

10.shader应用

  • 裁剪图片
  • 马赛克(先扩大100倍,取值后缩小忽略小数点,有的只重复会被忽略)
  • 阴影(从光源方向加一个摄像机,先渲染一遍记录深度。最终渲染利用这个信息)
  • 全屏泛光(可以影响模型之外的像素,从当前像素附近取其他像素颜色进行调整)
  • UI处理 可以直接丢弃某些位置的渲染,实现拼图功能

11.减少采样有利于性能的提升

视频链接:游戏开发入门系列(3) 图形渲染(第1节)_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-830824.html

到了这里,关于图形渲染基础学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓游戏开发之图形渲染技术优劣分析

            随着移动设备的普及和性能的提升,安卓游戏开发已经成为一个热门领域。在安卓游戏开发中,图形渲染技术是关键的一环。本文将对安卓游戏开发中常用的图形渲染技术进行分析,比较它们的优劣,并探讨它们在不同应用场景下的适用性。 2.1 、OpenGL ES      

    2024年02月20日
    浏览(50)
  • 游戏引擎技术——前向渲染与延迟渲染

    作者:yangkuKO 一、前言 2015年5月,3A巨作《巫师3:狂猎(The Witcher 3:Wild Hunt)》横空出世,该游戏作为一款开放世界的角色扮演游戏,其巨大的开放世界、绵长的剧情故事、画面精美的表现力深深吸引着大量玩家,并在当年一举拿下 年度最佳游戏、最佳RPG、金操纵杆奖、最

    2024年04月27日
    浏览(33)
  • OSG三维渲染引擎编程学习之七十七:“第七章:OSG场景图形交互” 之 “7.9 场景漫游”

    目录 第七章 OSG场景图形交互 7.9 场景漫游 7.9.1 场景漫游描述 7.9.2 自定义场景漫游器

    2024年02月07日
    浏览(59)
  • 【游戏引擎Easy2D】基于基础类型展开的监听器学习详解

       🧛‍♂️ iecne个人主页: 点赞关注收藏评论支持哦~ 💡每天 关注 iecne的作品,一起进步 👉本文收录 专栏 :【C++游戏引擎】 🐳希望大家多多支持🥰一起进步呀! 哈喽大家好,我是 iecne ,本期为大家带来的是CPP/C++【游戏引擎Easy2D】一篇打通引擎顶级类型,Listener。包

    2024年01月17日
    浏览(74)
  • 游戏引擎架构01__引擎架构图

    根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ​

    2024年04月09日
    浏览(37)
  • 游戏引擎UE如何革新影视行业?创意云全面支持UE云渲染

     虚幻引擎UE(Unreal Engine)作为一款“殿堂级”的游戏引擎,占据了全球80%的商用游戏引擎市场,但如果仅仅将其当做游戏开发的工具,显然是低估了它的能力。比如迪士尼出品的电视剧《曼达洛人》、电影《狮子王》等等都使用了虚幻的虚拟场景。  可见 游戏行业与影视行

    2024年02月16日
    浏览(34)
  • 一文读懂Unreal Engine游戏引擎如何提高数字孪生场景渲染能力

    以下案例来自于《数字孪生世界白皮书(2023版)》 领取方式:公众号「EasyV数字孪生」后台回复「白皮书」即可领取! Unreal Engine(下文简称为UE),是一款由Epic Games开发的游戏引擎,用于创建电子游戏、虚拟现实和增强现实应用、数字孪生等内容。UE支持实时渲染、高品质

    2024年02月12日
    浏览(46)
  • 游戏引擎架构-游戏支持的系统

    本篇知识点来源于《游戏引擎架构》第五章,此章节主要讨论多数游戏引擎中都会出现的底层支持系统。 C++静态初始化次序是无法使用的,原因是我们无法预引擎子系统的构造函数调用次序和析构函数调用次序。比如我要启动引擎的A,B,C系统,无法保证这些系统是按照规定

    2024年01月16日
    浏览(44)
  • 【架构】Java实现游戏引擎

    学过编程后,感觉所有的游戏都离不开两个方法,一个是画面更新,一个是指令输入。大概所有的游戏都有这几步流程: 输入指令 根据指令做业务逻辑的判断 根据判断结果更新画面 既然大多数的游戏都离不开这几步,那么为了便利游戏的开发,一些工程师就把这几个方法抽

    2024年02月13日
    浏览(45)
  • 游戏引擎架构-资源及文件系统

    本篇知识点来源于《游戏引擎架构》第六章,主要讨论现代三维游戏引擎中典型资源管理器的运作方式。 对于大部分资产来说,游戏引擎并不会使用其原本的格式。资产需要经过一些资产调节管道,把资产转换为引擎所需的格式。当流经资产调节管道时,每个资源都需要用一

    2024年01月18日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包