• 实时渲染,一般有三种渲染方法,多光源一次渲染,多光源多次渲染和延迟着色。多光源一次渲染:对于每个物体,计算所有光源对其的影响来对该物体进行渲染for each object do for each light do framebuffer = light...

    实时渲染,一般有三种渲染方法,多光源一次渲染多光源多次渲染延迟着色

    多光源一次渲染:对于每个物体,计算所有光源对其的影响来对该物体进行渲染

    for each object do
        for each light do
            framebuffer = light_model(object,light);

    这是一个简单的方法,但是存在一些问题和缺陷。
    第一个问题由于光照是针对每一个物体进行的,因此*之前渲染着色的对象能够被之后渲染着色的对象所取代*,换句话讲,对隐藏对象进行着色是浪费的。
    第二个问题是如何在可编程渲染管线中,在一次渲染过程中管理多个光源。此外,该方法很难与阴影算法进行集成。

    多光源多次渲染:对于每一个光照计算过程,执行所有光照计算。因此,对于每一个光源,所有被该光源影响的物体会被渲染。

    for each light do
        for each object affected by light do
            framebuffer += light_model(object,light);

    与第一个方法类似,
    第一个问题:隐藏曲面会造成渲染的浪费。
    第二个问题:光照首先对于每一个光源计算,然后对每一个物体计算。有可能有一些计算过程(例如,顶点转换和三角面片设置[Moller02])由于同一个物体在另外一个光照计算中被再次处理而重复计算。
    第三个问题:由于光源排序和物体排序时互斥的,因此很难执行此操作。

    延迟着色:原理,将每个像素点的属性存储在显存里面用于后面的渲染,后面的渲染则是一个像素一个像素的渲染,每个像素都会独立的渲染。
    在上面两种渲染方法,延迟着色有很大的优势,特别是在效率上面,时间复杂度要小很多

    for each object do
        G-buffer = lighting properties of object;
    for each light do
        framebuffer += light_model(G-buffer,light);

    延迟着色还有一些其它优势。例如,一旦几何处理和光源处理进行解耦分离,很容易进行批操作。

    展开全文
  • "一条锁链不比它最弱的一环坚实” (A chain ...管线的主要功能是根据给定的虚拟摄像机,3维模型,灯光,着色方程,纹理以及其它的资源来生成一个2维的图像渲染管线是实时渲染的底层工具。图2.1描述了管线的流程,在该
    "一条锁链不比它最弱的一环坚实” (A chain is no stronger than its weakest link)
         ----匿名

         本章节呈现了实时渲染中最核心部分:图形渲染管线,简称管线。管线的主要功能是根据给定的虚拟摄像机,3维模型,灯光,着色方程,纹理以及其它的资源来生成一个2维的图像,渲染管线是实时渲染的底层工具。图2.1描述了管线的流程,在该图中模型的形状取决于它们的几何结构,场景特点,以及相机在场景中摆放,模型的外观受材质属性,灯光资源,纹理以及着色模型的影响。
         渲染管理中的不同阶段接下来会去讨论和解析,会关注于于它们的功能而不是具体实现,实现细节要么留给后面的章节要么是一些程序员不可控制的元素。例如对于使用线而言最重要的是顶点数据格式,颜色,模式类型以及是否使用景深(depth cueing),而不是线段是否使用Bresenham线段绘制算法[142]或是对称两步算法进行实现,通常这些管线阶段使用不可编程的硬件进行实现,这也使用实现优化变得不可实现。关于绘制填充算法细节在Rogers[1077]的书中有更深入的讲解。在底层硬件的实现上我们只有极少的控制权,算法以及编码方式对图像处理的速度及质量具有极大的影响。
         
    展开全文
  • 图形图像渲染原理

    2019-11-11 11:26:53
    目录 引言 GPU 历史 GPU 图形渲染流水线 GPU 存储系统 GPU 流处理器 CPU-GPU 异构系统 GPU 资源管理模型 ...屏幕图像显示原理 ...作为程序员,我们或多或少知道可视化应用程序都是由 CPU ...

    目录

    引言

    GPU 历史

    GPU 图形渲染流水线

    GPU 存储系统

    GPU 流处理器

    CPU-GPU 异构系统

    GPU 资源管理模型

    CPU-GPU 工作流

    屏幕图像显示原理


    引言

    原文链接 http://chuquan.me/2018/08/26/graphics-rending-principle-gpu/

    作为程序员,我们或多或少知道可视化应用程序都是由 CPU 和 GPU 协作执行的。那么我们就先来了解一下两者的基本概念:

    • CPU(Central Processing Unit):现代计算机的三大核心部分之一,作为整个系统的运算和控制单元。CPU 内部的流水线结构使其拥有一定程度的并行计算能力。
    • GPU(Graphics Processing Unit):一种可进行绘图运算工作的专用微处理器。GPU 能够生成 2D/3D 的图形图像和视频,从而能够支持基于窗口的操作系统、图形用户界面、视频游戏、可视化图像应用和视频播放。GPU 具有非常强的并行计算能力。

    这时候可能会产生一个问题:CPU 难道不能代替 GPU 来进行图形渲染吗?答案当然是肯定的,不过在看了下面这个视频就明白为什么要用 GPU 来进行图形渲染了。

    GPU CPU 模拟绘图视频

    使用 GPU 渲染图形的根本原因就是:速度。GPU 的并行计算能力使其能够快速将图形结果计算出来并在屏幕的所有像素中进行显示。

    那么像素是如何绘制在屏幕上的?计算机将存储在内存中的形状转换成实际绘制在屏幕上的对应的过程称为 渲染。渲染过程中最常用的技术就是 光栅化

    关于光栅化的概念,以下图为例,假如有一道绿光与存储在内存中的一堆三角形中的某一个在三维空间坐标中存在相交的关系。那么这些处于相交位置的像素都会被绘制到屏幕上。当然这些三角形在三维空间中的前后关系也会以遮挡或部分遮挡的形式在屏幕上呈现出来。一句话总结:光栅化就是将数据转化成可见像素的过程。

    GPU 则是执行转换过程的硬件部件。由于这个过程涉及到屏幕上的每一个像素,所以 GPU 被设计成了一个高度并行化的硬件部件。

    下面,我们来简单了解一下 GPU 的历史。

    GPU 历史

    GPU 还未出现前,PC 上的图形操作是由 视频图形阵列(VGA,Video Graphics Array) 控制器完成。VGA 控制器由连接到一定容量的DRAM上的存储控制器和显示产生器构成。

    1997 年,VGA 控制器开始具备一些 3D 加速功能,包括用于 三角形生成光栅化纹理贴图 和 阴影

    2000 年,一个单片处图形处理器继承了传统高端工作站图形流水线的几乎每一个细节。因此诞生了一个新的术语 GPU 用来表示图形设备已经变成了一个处理器。

    随着时间的推移,GPU 的可编程能力愈发强大,其作为可编程处理器取代了固定功能的专用逻辑,同时保持了基本的 3D 图形流水线组织。

    近年来,GPU 增加了处理器指令和存储器硬件,以支持通用编程语言,并创立了一种编程环境,从而允许使用熟悉的语言(包括 C/C++)对 GPU 进行编程。

    如今,GPU 及其相关驱动实现了图形处理中的 OpenGL 和 DirectX 模型,从而允许开发者能够轻易地操作硬件。OpenGL 严格来说并不是常规意义上的 API,而是一个第三方标准(由 khronos 组织制定并维护),其严格定义了每个函数该如何执行,以及它们的输出值。至于每个函数内部具体是如何实现的,则由 OpenGL 库的开发者自行决定。实际 OpenGL 库的开发者通常是显卡的生产商。DirectX 则是由 Microsoft 提供一套第三方标准。

    GPU 图形渲染流水线

    GPU 图形渲染流水线的主要工作可以被划分为两个部分:

    • 把 3D 坐标转换为 2D 坐标
    • 把 2D 坐标转变为实际的有颜色的像素

    GPU 图形渲染流水线的具体实现可分为六个阶段,如下图所示。

    • 顶点着色器(Vertex Shader)
    • 形状装配(Shape Assembly),又称 图元装配
    • 几何着色器(Geometry Shader)
    • 光栅化(Rasterization)
    • 片段着色器(Fragment Shader)
    • 测试与混合(Tests and Blending)

    第一阶段,顶点着色器。该阶段的输入是 顶点数据(Vertex Data) 数据,比如以数组的形式传递 3 个 3D 坐标用来表示一个三角形。顶点数据是一系列顶点的集合。顶点着色器主要的目的是把 3D 坐标转为另一种 3D 坐标,同时顶点着色器可以对顶点属性进行一些基本处理。

    第二阶段,形状(图元)装配。该阶段将顶点着色器输出的所有顶点作为输入,并将所有的点装配成指定图元的形状。图中则是一个三角形。图元(Primitive) 用于表示如何渲染顶点数据,如:点、线、三角形。

    第三阶段,几何着色器。该阶段把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。例子中,它生成了另一个三角形。

    第四阶段,光栅化。该阶段会把图元映射为最终屏幕上相应的像素,生成片段。片段(Fragment) 是渲染一个像素所需要的所有数据。

    第五阶段,片段着色器。该阶段首先会对输入的片段进行 裁切(Clipping)。裁切会丢弃超出视图以外的所有像素,用来提升执行效率。

    第六阶段,测试与混合。该阶段会检测片段的对应的深度值(z 坐标),判断这个像素位于其它物体的前面还是后面,决定是否应该丢弃。此外,该阶段还会检查 alpha 值( alpha 值定义了一个物体的透明度),从而对物体进行混合。因此,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。

    关于混合,GPU 采用如下公式进行计算,并得出最后的颜色。

    1
    
    R = S + D * (1 - Sa)
    

    关于公式的含义,假设有两个像素 S(source) 和 D(destination),S 在 z 轴方向相对靠前(在上面),D 在 z 轴方向相对靠后(在下面),那么最终的颜色值就是 S(上面像素) 的颜色 + D(下面像素) 的颜色 * (1 - S(上面像素) 颜色的透明度)

    上述流水线以绘制一个三角形为进行介绍,可以为每个顶点添加颜色来增加图形的细节,从而创建图像。但是,如果让图形看上去更加真实,需要足够多的顶点和颜色,相应也会产生更大的开销。为了提高生产效率和执行效率,开发者经常会使用 纹理(Texture) 来表现细节。纹理是一个 2D 图片(甚至也有 1D 和 3D 的纹理)纹理一般可以直接作为图形渲染流水线的第五阶段的输入

    最后,我们还需要知道上述阶段中的着色器事实上是一些程序,它们运行在 GPU 中成千上万的小处理器核中。这些着色器允许开发者进行配置,从而可以高效地控制图形渲染流水线中的特定部分。由于它们运行在 GPU 中,因此可以降低 CPU 的负荷。着色器可以使用多种语言编写,OpenGL 提供了 GLSL(OpenGL Shading Language) 着色器语言。

    GPU 存储系统

    早期的 GPU,不同的着色器对应有着不同的硬件单元。如今,GPU 流水线则使用一个统一的硬件来运行所有的着色器。此外,nVidia 还提出了 CUDA(Compute Unified Device Architecture) 编程模型,可以允许开发者通过编写 C 代码来访问 GPU 中所有的处理器核,从而深度挖掘 GPU 的并行计算能力。

    下图所示为 GPU 内部的层级结构。最底层是计算机的系统内存,其次是 GPU 的内部存储,然后依次是两级 cache:L2 和 L1,每个 L1 cache 连接至一个 流处理器(SM,stream processor)

    • SM L1 Cache 的存储容量大约为 16 至 64KB。
    • GPU L2 Cache 的存储容量大约为几百 KB。
    • GPU 的内存最大为 12GB。

    GPU 上的各级存储系统与对应层级的计算机存储系统相比要小不少。

    此外,GPU 内存并不具有一致性,也就意味着并不支持并发读取和并发写入。

    GPU 流处理器

    下图所示为 GPU 中每个流处理器的内部结构示意图。每个流处理器集成了一个 L1 Cache。顶部是处理器核共享的寄存器堆。

    CPU-GPU 异构系统

    至此,我们大致了解了 GPU 的工作原理和内部结构,那么实际应用中 CPU 和 GPU 又是如何协同工作的呢?

    下图所示为两种常见的 CPU-GPU 异构架构。

    左图是分离式的结构,CPU 和 GPU 拥有各自的存储系统,两者通过 PCI-e 总线进行连接。这种结构的缺点在于 PCI-e 相对于两者具有低带宽和高延迟,数据的传输成了其中的性能瓶颈。目前使用非常广泛,如PC、智能手机等。

    右图是耦合式的结构,CPU 和 GPU 共享内存和缓存。AMD 的 APU 采用的就是这种结构,目前主要使用在游戏主机中,如 PS4。

    注意,目前很多 SoC 都是集成了CPU 和 GPU,事实上这仅仅是在物理上进行了集成,并不意味着它们使用的就是耦合式结构,大多数采用的还是分离式结构。耦合式结构是在系统上进行了集成。

    在存储管理方面,分离式结构中 CPU 和 GPU 各自拥有独立的内存,两者共享一套虚拟地址空间,必要时会进行内存拷贝。对于耦合式结构,GPU 没有独立的内存,与 GPU 共享系统内存,由 MMU 进行存储管理。

    图形应用程序调用 OpenGL 或 Direct3D API 功能,将 GPU 作为协处理器使用。API 通过面向特殊 GPU 优化的图形设备驱动向 GPU 发送命令、程序、数据。

    GPU 资源管理模型

    下图所示为分离式异构系统中 GPU 的资源管理模型示意图。

    1. MMIO(Memory-Mapped I/O)
    • CPU 通过 MMIO 访问 GPU 的寄存器状态。
    • 通过 MMIO 传送数据块传输命令,支持 DMA 的硬件可以实现块数据传输。
    1. GPU Context
    • 上下文表示 GPU 的计算状态,在 GPU 中占据部分虚拟地址空间。多个活跃态下的上下文可以在 GPU 中并存。
    1. CPU Channel
    • 来自 CPU 操作 GPU 的命令存储在内存中,并提交至 GPU channel 硬件单元。
    • 每个 GPU 上下文可拥有多个 GPU Channel。每个 GPU 上下文都包含 GPU channel 描述符(GPU 内存中的内存对象)。
    • 每个 GPU Channel 描述符存储了channel 的配置,如:其所在的页表。
    • 每个 GPU Channel 都有一个专用的命令缓冲区,该缓冲区分配在 GPU 内存中,通过 MMIO 对 CPU 可见。
    1. GPU 页表
    • GPU 上下文使用 GPU 页表进行分配,该表将虚拟地址空间与其他地址空间隔离开来。
    • GPU 页表与 CPU 页表分离,其驻留在 GPU 内存中,物理地址位于 GPU 通道描述符中。
      通过 GPU channel 提交的所有命令和程序都在对应的 GPU 虚拟地址空间中执行。
    • GPU 页表将 GPU 虚拟地址不仅转换为 GPU 设备物理地址,还转换为主机物理地址。这使得 GPU 页面表能够将 GPU 存储器和主存储器统一到统一的 GPU 虚拟地址空间中,从而构成一个完成的虚拟地址空间。
    1. PFIFO Engine
    • PFIFO 是一个提交 GPU 命令的特殊引擎。
    • PFIFO 维护多个独立的命令队列,即 channel。
    • 命令队列是带有 put 和 get 指针的环形缓冲器。
    • PFIFO 引擎会拦截多有对通道控制区域的访问以供执行。
    • GPU 驱动使用一个通道描述符来存储关联通道的设置。
    1. BO
    • 缓冲对象(Buffer Object)。一块内存,可以用来存储纹理,渲染对象,着色器代码等等。

    CPU-GPU 工作流

    下图所示为 CPU-GPU 异构系统的工作流,当 CPU 遇到图像处理的需求时,会调用 GPU 进行处理,主要流程可以分为以下四步:

    1. 将主存的处理数据复制到显存中
    2. CPU 指令驱动 GPU
    3. GPU 中的每个运算单元并行处理
    4. GPU 将显存结果传回主存

    屏幕图像显示原理

    介绍屏幕图像显示的原理,需要先从 CRT 显示器原理说起,如下图所示。CRT 的电子枪从上到下逐行扫描,扫描完成后显示器就呈现一帧画面。然后电子枪回到初始位置进行下一次扫描。为了同步显示器的显示过程和系统的视频控制器,显示器会用硬件时钟产生一系列的定时信号。当电子枪换行进行扫描时,显示器会发出一个水平同步信号(horizonal synchronization),简称 HSync;而当一帧画面绘制完成后,电子枪回复到原位,准备画下一帧前,显示器会发出一个垂直同步信号(vertical synchronization),简称 VSync。显示器通常以固定频率进行刷新,这个刷新率就是 VSync 信号产生的频率。虽然现在的显示器基本都是液晶显示屏了,但其原理基本一致。

    下图所示为常见的 CPU、GPU、显示器工作方式。CPU 计算好显示内容提交至 GPU,GPU 渲染完成后将渲染结果存入帧缓冲区,视频控制器会按照 VSync 信号逐帧读取帧缓冲区的数据,经过数据转换后最终由显示器进行显示。

    最简单的情况下,帧缓冲区只有一个。此时,帧缓冲区的读取和刷新都都会有比较大的效率问题。为了解决效率问题,GPU 通常会引入两个缓冲区,即 双缓冲机制。在这种情况下,GPU 会预先渲染一帧放入一个缓冲区中,用于视频控制器的读取。当下一帧渲染完毕后,GPU 会直接把视频控制器的指针指向第二个缓冲器。

    双缓冲虽然能解决效率问题,但会引入一个新的问题。当视频控制器还未读取完成时,即屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂现象,如下图:

    为了解决这个问题,GPU 通常有一个机制叫做垂直同步(简写也是 V-Sync),当开启垂直同步后,GPU 会等待显示器的 VSync 信号发出后,才进行新的一帧渲染和缓冲区更新。这样能解决画面撕裂现象,也增加了画面流畅度,但需要消费更多的计算资源,也会带来部分延迟。

    展开全文
  • 视频链接:游戏开发入门(三)图形渲染(3节课 时常:...渲染一般分为离线渲染实时渲染,游戏中我们用的都是实时渲染。 1.实时渲染又可以分为2D渲染与3D渲染。 早期的2D渲染,是通过把一块内存(图片像素数据)...

    视频链接:游戏开发入门(三)图形渲染(3节课 时常:约2小时20分钟)
    视频链接:一堂课学会shader——渲染拓展课程(3节课 时常:约1小时20分钟)


    笔记与总结(请先学习视频内容):

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

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

    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.材质、贴图、纹理
    贴图、纹理、材质的区别是什么?


    一堂课学会shader笔记:

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

    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.减少采样有利于性能的提升


    上一篇:游戏开发入门(二)游戏中的设计模式
    下一篇:游戏开发入门(四)逻辑与脚本开发

    原文链接(转载请标明):http://blog.csdn.net/u012999985/article/details/79090657

    展开全文
  • 4.后处理渲染案例; 5.Shader 编程优化案例; --图形学编程- https://blog.csdn.net/jxw167/article/category/6624969 如何快速成长为图形学工程师- https://blog.csdn.net/GitChat/article/details/...

    -- 图形学工程师
    1.渲染执行流程;
    2.Shader 编程技巧;
    3.材质渲染案例;
    4.后处理渲染案例;
    5.Shader 编程优化案例;

    -- 图形学编程- https://blog.csdn.net/jxw167/article/category/6624969

    如何快速成长为图形学工程师- https://blog.csdn.net/GitChat/article/details/79102568 
    OpenGL核心技术- https://blog.csdn.net/column/details/14637.html
    Google Android多媒体和图形图像- https://github.com/google/grafika
    学openGL必知道的图形学知识- http://blog.csdn.net/king1425/article/details/71425556

    图形算法中的矩阵和矢量。编写OpenGL图形算法的语言GLSL。

    android图像处理的知识,主要是Bitmap,Canvas,Shader,Matric,ColorFilter和Xfermode的使用。

    -- 图形渲染库,GPU 编程(Shader 编程)

      图形渲染库有 DX(DirectX)、OpenGL、OpenGLES、WebGL。
      实现渲染技术就需要对 GPU 编程,也就是我们通常说的 Shader 编程。
      Shader 编程其实就是对图像进行编程,常见的图像格式有:jpg、png、tga、tga、bmp 等.
      作为图形学开发者首要的事情是搞清楚它们的存储格式,每种图像格式它包括很多信息,当然主要还是颜色的存储:rgb 或者说 rgba,另外图像的存储是按照矩阵的方式.
      对 GPU 编程核心就是对图像的处理,只有掌握了它们,我们才可以根据策划的需求或者是美术的需求做出各种渲染效果,比如在材质中剔除黑色,进行反射,折射,以及高光、法线等的渲染。
      即使是后处理渲染又称为滤镜的渲染也是对图片像素的处理,与材质渲染不同的是它是对整个场景的渲染,因为游戏运行也是通过一帧一帧渲染的图片播放的,后处理就是对这些图片进行再渲染。
      从固定流水线讲起,作为图形学开发是必须要掌握的,因为固定流水线是图形学渲染的基础,它们的核心是各个空间之间的矩阵变换。固定流水线是 3D 游戏引擎开发的最基本的底层核心。
      通俗的讲,固定流水线的原理就是将 3D 图形转换成屏幕上的 2D 图像显示的过程,在此过程中都是通过 CPU 处理的,以前那些比较老的 3D 游戏都是按照这个原理制作的。
      可编程流水线主要是针对 GPU 编程的,换句话说就是将固定流水线的矩阵变换放到 GPU 中进行计算,这样可以彻底解放 CPU 用于处理其他事情,提升效率。

    > GPU 编程语言目前有 3 种主流语言:
    1.基于 OpenGL 的 GLSL(OpenGLShading Language,也称为 GLslang)
    2.基于 Direct3D 的 HLSL(High Level ShadingLanguage)语言,
    3.NVIDIA 公司的 Cg (C for Graphic)语言。

       GPU 比较擅长做的就是关于矩阵的运算。GPU 不仅能用于渲染材质,而且还能渲染场景也就是我们说的后处理,又称为滤镜。
       Shader 的核心用法就是材质渲染,材质渲染无非涉及到材质高光,法线这些点,还有反射,折射,卡通渲染,描边等等,以及 Unity 高版本实现的 PBR 物理效果。 Shader 渲染都是基于图像的处理方式,不论是材质渲染还是后处理渲染.
       现在比较流行的 H5 游戏,它使用的渲染库是 WebGL,WebGL 提供了相应的接口,用于加载已有的 Shader,当然 OpenGL,DX 都提供了相应的接口。像 Bloom(全屏泛光)这些后处理渲染效果,在游戏场景中是必备的渲染,它们的实现方式都是在 GPU 中实现的。
    Shader Forge教程一:http://blog.csdn.net/jxw167/article/details/69267236
    Shader Forge教程二:http://blog.csdn.net/jxw167/article/details/69257559

    mpeg的帧头和格式。帧头的帧同步。ijkplayer是基于ffplay改造的。
    - 图像性能 openGL?GPUImage(OpenGL ES)的性能优化、爬坑与架构改善
    GPU OpenGL ES 应用性能优化- https://blog.csdn.net/dongtinghong/article/details/80081404
    OpenGL ES优化的主要工作是在图形管道中找到影响性能的bottleneck,其bottleneck一般表现在以下几方面:
    1.在应用程序代码中,如冲突检测
    2.GPU与主内存间的数据传输
    3.在VP(Vertex Processor)中的顶点处理
    4.在FP(Fragment Processor)中的片断处理

      无论OpenGL ES、Metal还是Vulkan,优化都是两块:CPU和GPU。目标是减少CPU调用、降低I/O以及简化Shader代码中的复杂逻辑。
      GPUImage的实现里没使用VBO,当多个Filter叠加时,每个Filter绘制都需要上传坐标数据会带来额外的消耗。对GPUImage进行二次开发,在GPUImageFilter中创建VAO及VBO,对于某一Filter需要旋转图像,可在其自己的着色器中使用旋转矩阵达到目的。
      Shader优化:

    Shader代码实现了我们的算法,想要大幅降低Shader的耗时,降低图像质量实现减少计算量是最有效的办法。在尽量可能保证质量的基础上进行优化,一般有这些办法:
    (1)避免在Shader中使用循环或分支判断语句
    (2)避免依赖纹理读取。即,避免在Fragment Shader计算纹理坐标,将计算提前到Vertex Shader,减少计算次数。
    (3)避免交换纹理坐标分量。这会造成依赖纹理读取。
    (4)避免在Fragment Shader做pow等数据计算。同样的,尽可能将计算提前到Vertex Shader,减少计算次数
    (5)使用更少的颜色分量参与计算。选择影响结果的主要颜色分量参与计算,这也是减少计算量的有效方法。
    (6)降低数据精度。比如,从Vertex Shader传递到Fragment Shader的纹理坐标精度从highp改成mediump也会降低一些消耗。
      如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存)。

    - 3D图像渲染管道包括以下几个主要步骤:
     1,顶点处理:对模型的各个顶点进行计算(着色)以及坐标变换
     2,光栅化:将每个图元转换为一系列的碎片。我们可以认为一个碎片就是三维空间中的一个像素,同样具有位置,颜色,法线和纹理属性。
     3,碎片处理:光栅化之后,我们得到一些列的碎片,这个阶段则是对碎片进行处理(着色)
     4,合并输出:将所有的碎片(3D概念中)转化成二维的颜色像素,最后输出显示到屏幕上

    注:如果读者对矩阵变换不理解可以查看《线性代数》和《3D 数学基础:图形与游戏开发》

    展开全文
  • “异构混合平台三维实时渲染网格”中的“混合平台”是指由Autodesk Maya、Autodesk 3DS Max等三维建模软件组成的混合数字内容产品开发环境,“异构”是指渲染节点、控制节点文件服务存储节点服务器(共享资源文件...
  • 镜像变换 GPU 渲染主要包括以下几个步骤: 1) 设置 1 个输入纹理; 2) 对输入纹理进行纹理采样; 3) 设置变换矩阵; 4) 在顶点着色器中,将输入顶点与变换矩阵相乘; 5) 输出图像数据;
  • FPGA图像处理基本技巧

    2018-07-25 10:14:15
    ... FPGA实现的连通域识别算法升级 Verilog是一种思维方式   先来谈一下怎样才能学好Verilog这个问题。有人说学Verilog很难,好像比C语言还要难学。有一定难度是真的,但并没有比别的语言更难...
  • 数字图像处理

    2019-03-04 13:38:44
    图像处理 数字图像处理 利用计算机技术或其他数字技术,对图像信息进行数学运算与加工的处理 模拟图像处理 又称光学图像处理,利用光学透镜或光学照相方法对模拟图像进行处理 光电结合处理 (模拟图像处理与...
  • 在网上找了找,并没有合适的解决方法,还有我使用JPEG的格式保存到本地是可以正常显示出图片,但使用YUV420_888则看到的是黑色的图像(不知道这是不是图像没有处理的原因),我想问的是JPEG如何搞成RGB的模式。...
  • 第二章 图形渲染管道  一环薄弱,全局必跨。  ----匿名  本章介绍实时图形的核心部分:图形渲染管道,也简单地称作管道。...图像中对象的问你只形状有下面几个方面决定:对象的几何形状、
  • GLSL实现图像处理

    2015-05-06 21:25:10
     这些操作其本质上是属于图像处理的东西,OpenGL实现图像处理主要是用到了GLSL着色语言。具体到着色器就是片段着色器。 说白了就是如何用OpenGL做通用GPU计算,OpenGL做通用计算的步骤主要如下:读取数据->顶点
  • 数字图像处理第六章数字图像处理---彩色图像处理(一) 在 MATLAB 中彩色图像的表示(二)仿射变换(三)投影变换(四)应用于图像的几何变换(五)MATLAB 中的图像坐标系统5.1 输出图像位置5.2 控制输出网格(六)...
  • 三维渲染引擎

    2019-08-11 15:48:26
    三维渲染引擎主要分为:实时三维渲染引擎离线三维渲染引擎。 实时三维渲染引擎主要用于游戏中三维画面的生成,而离线三维渲染引擎用于视频中三维画面的生成。 对物质的抽象方式 三维渲染引擎对物质的抽象主要有...
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...
  • PCL—综述—三维图像处理 http://www.cnblogs.com/ironstark/p/4996929.html  很不错的博客系列 带有艺术范,更大视角的处理点云 点云模型与三维信息   三维图像是一种特殊的信息表达形式,其...
  • 原文地址:Matlab图像处理函数汇总 作者:mimi 图像的变换  ① fft2:fft2函数用于数字图像的二维傅立叶变换,如:i=imread('104_8.tif'); j=fft2(i); ②ifft2::ifft2函数用于数字图像的二维傅立叶反变换,如...
  • 在计算机图形学中,延迟渲染( Deferred Rendering) ,即延迟着色(Deferred Shading),是将着色计算延迟到深度测试之后进行处理的一种渲染方法。延迟着色技术的最大的优势就是将光源的数目场景中物体的数目在...
  • 【原】实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简单,如有错误,请大家指正。 回到顶部
  • 这篇文章将总结提炼《Real-Time Rendering 3rd》(实时渲染图形学第三版)的第五章“Visual Appearance(视觉外观)”的内容。当我们渲染三维模型的图像时,模型不仅要有适当的几何形状,还应该有所需的视觉外观。...
1 2 3 4 5 ... 20
收藏数 61,896
精华内容 24,758