精华内容
参与话题
问答
  • 渲染的基本常识

    千次阅读 2018-03-13 13:53:22
    1.渲染流程(又叫渲染管线、渲染流水线) 渲染流程的任务:从一个三维的场景出发,渲染出一张二维的图像。 《Real-Time Rendering》中将渲染流程分成三个阶段:应用阶段、几何阶段、光栅化阶段。 应用阶段 ...

    内容会持续更新,有错误的地方欢迎指正,谢谢!

    1.渲染流程(又叫渲染管线、渲染流水线)

    渲染流程的任务:从一个三维的场景出发,渲染出一张二维的图像。

    《Real-Time Rendering》中将渲染流程分成三个阶段:应用阶段、几何阶段、光栅化阶段。

    这里写图片描述

    应用阶段

    1. 主要是CPU与内存打交道,输出渲染图元(渲染所需的几何信息:点、线、三角面等),将图元加载到显存中,如此,GPU可快速访问这些数据。
    2. 设置渲染状态:也就是使用什么材质、纹理、着色器等。
    3. 调用Draw Call:DrawCall的发起方是CPU,接收方是GPU,它告诉GPU按照设置的渲染状态来渲染,一个Draw Call指向本次需要渲染的图元列表。

    如下图所示,发送渲染命令就是发送Draw Call。
    这里写图片描述

    几何阶段

    主要负责顶点坐标变换、屏幕映射
    顶点坐标变换:模型坐标—>世界坐标—>观察坐标—>裁剪坐标—>屏幕坐标

    MVP矩阵能将顶点从模型空间转换到裁剪空间。顶点着色器(有多少个顶点就会运行多少次)的最基本的任务就是通过MVP矩阵(模型-视图-投影矩阵)把顶点坐标从模型空间转换到裁剪空间中。从裁剪空间到屏幕空间是Unity自动完成的。

    投影矩阵:投影矩阵并没有进行真正的投影,而是为后面真正的投影做准备。投影是个降维的过程,从三维降到二维,但真正的投影发生在后面的屏幕映射中,通过齐次除法获得二维坐标。

    光栅化阶段

    1. 通过三角形设置和遍历计算每个图元覆盖了哪些像素:这时三维模型已经投影到了二维平面上,但屏幕是一个个小的像素格子,光栅化就是在选格子嘛。
      三角形设置:计算光栅化一个三角网格所需的信息,它的输出是为下一步骤做准备。
      三角形遍历:找到哪些像素被三角网格覆盖的过程。对应像素会生成一个片元,而片元中的状态是对三个顶点的信息进行插值得到的。
      这里写图片描述

    2. 为这些像素计算它们的颜色:光栅化后得到了格子,要搞上颜色,且没法将一个格子一半涂成白色一半涂成黑色,所以我们追求高像素屏幕,像素越高,效果越好。这时候会用到片元着色器(有多少个像素就会运行多少次)负责给每个像素上色。
      这里写图片描述

    3. 各种测试用于决定每个片元的可见性,涉及了很多测试工作。比如:模板测试(限制渲染区域)、深度测试(不小于深度缓冲区中该片元的深度值就舍弃该片元)等测试。如果一个片元通过了所有测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行混合,最后再写入颜色缓冲区。也就是将片元的颜色值一个个地堆叠起来。

    2.MipMap和LOD

    MipMap这个东西在二维比较常见,三维通常会用到LOD。

    MipMap:给一张图通过图像处理自动生成多张低分辨率的图。为了解决图像无限缩小(960w平方公里的图片相对于你手机来说,那就是无限缩小)引起的失真问题。

    LOD:层次细节,对同一个物体,就是它根据离摄像机的远近来使用不同的模型。不过,LOD分几个级别,美术就得做几套资源给你,不像MipMap一样电脑帮你自动生成。

    3.优秀的高光反射光照模型Blinn-Phone

    虽然是一个经验模型,但已经能满足大多数的需求了,很常用。

    公式:
    这里写图片描述

    C light是入射光线的颜色和强度
    M specular是材质的高光反射系数
    n是法线方向
    h是由视角方向v和光照方向l 共同决定的,是一个半角向量
    n和h做点积。
    这里写图片描述

    4.法线贴图

    法线贴图呈现为蓝紫色,美术可以用软件生成。法线贴图的每个像素的RGB存的是模型法线的XYZ。若要实现外表凹凸不平的效果,常用的方法是使用一张法线贴图来修改模型表面的法线,以便为模型提供更多的细节,这种方法又被称为法线映射。

    另外,渐变纹理(又叫坡度图)可用于渲染卡通风格;遮罩纹理可给模型增加更多的细节,让其某些地方看起来更亮一些,有些地方更暗一些。

    5.基本shader的编写

    Unity Shader的基本结构:根目录、Property属性、 SubShader子着色器、Fallback回滚。

    其中,一个SubShader中可以有多个Pass,但Pass数目过多,会造成渲染性能降低,因为一个Pass定义了一次完整的渲染流程。

    SubShader可以理解成由Tags(标签:告诉Unity怎样渲染这个对象)和RenderSetup(渲染状态设置:是否开启深度测试等)和Pass三部分组成。

    在材质面板上显示属性的Shader代码:(注意a2v和v2f这两个结构体的使用)

    Shader"Unity Book/Chapter5/Simple Shader"
    {
        Properties
        {  
            _Color("Color Tint",Color) = (1.0,1.0,1.0,1.0)  
        }  
        SubShader
        {  
            Pass
            {  
                CGPROGRAM  
                #pragma vertex vert  
                #pragma fragment frag  
    
                //在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
                uniform fixed4 _Color;  
    
                struct a2v 
                {  
                    float4 vertex : POSITION;  
                    float3 normal : NORMAL;  
                    float4 texcoord : TEXCOORD0;  
                };  
    
                struct v2f 
                {  
                    float4 pos : SV_POSITION;  
                    fixed3 color : COLOR0;  
                };  
    
                v2f vert(a2v v) 
                {  
                    v2f o;  
                    o.pos = UnityObjectToClipPos(v.vertex);  
                    o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);  
                    return o;  
                }  
    
                fixed4 frag(v2f i) : SV_Target
                {  
                    return fixed4(i.color,1.0);  
                }  
                ENDCG  
            }  
        }  
    }  

    6.Unity引擎中前向、延迟渲染路径的区别

    前言:
    G-buffer:所有物体在不进行光照运算的情况下被绘制,然后对每个像素生成一组数据,这些数据包括位置、法线、高光颜色等。

    正题:
    所有的渲染路径的核心都是光照的处理。相比较逐顶点光照,游戏开发者更喜欢逐像素光照,但逐像素光照有一个显著的缺点:每个光源会让每个在它光照范围的物体增加一个渲染批次,所以才会有一个物体最多受4个光源影响的限制。

    所以,延迟渲染是光照问题的救星!

    1. 延迟渲染路径:使用任意数量的光源,也不会增加额外的渲染批次。因为大部分模型在渲染的时候并不需要光照计算,而是在屏幕空间中才使用光照信息,就如同渲染一张2D图片,这时使用的数据是在上一个批次中生成的G-buffer
    2. 前向渲染路径: 把空间的点进行各种剪裁后,再进行处理,所处理量远远大于我们最终看到的,并且是对每个光源进行计算产生最终结果。

    那到底采用哪个?

    1. 延迟渲染的确好,但是使用有限制。延迟渲染不允许我们渲染半透明物体。因为如果场景中存在半透明的物体,只能记录一个物体的信息。缺乏抗锯齿的支持,但你可以使用屏幕空间抗锯齿算法。
    2. 移动设备上延迟渲染的性能会比前向渲染的性能要差一些,如果你的场景中只有一个光源,那么使用延迟渲染是不划算的。
    展开全文
  • 什么是渲染

    千次阅读 2012-10-21 14:14:34
    渲染(Render)在电脑绘图中,是指:用软件从模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。图像是数字图像或者位图图像。渲染这个术语类似于...

    渲染Render)在电脑绘图中,是指:用软件模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。图像是数字图像或者位图图像。渲染这个术语类似于“艺术家对于场景的渲染”。另外渲染也用于描述:计算视频编辑文件中的效果,以生成最终视频输出的过程。

    渲染是三维计算机图形学中的最重要的研究课题之一,并且在实践领域它与其它技术密切相关。在图形流水线中,渲染是最后一项重要步骤,通过它得到模型与动画最终显示效果。自从二十世纪七十年代以来,随着计算机图形的不断复杂化,渲染也越来越成为一项重要的技术。

    渲染的应用领域有:计算机与视频游戏模拟电影或者电视特效以及可视化设计,每一种应用都是特性与技术的综合考虑。作为产品来看,现在已经有各种不同的渲染工具产品,有些集成到更大的建模或者动画包中,有些是独立产品,有些是开放源代码的产品。从内部来看,渲染工具都是根据各种学科理论,经过仔细设计的程序,其中有:光学视觉感知数学以及软件开发

    三维计算机图形的预渲染或者实时渲染的速度都非常慢。预渲染的计算强度很大,通常是用于电影制作;实时渲染经常用于三维视频游戏,通常依靠带有三维硬件加速器的图形卡完成这个过程。

    展开全文
  • 在前端开发中,页面渲染指什么

    千次阅读 2018-10-13 11:01:06
    从上面这个图中,我们可以看到那么几个事: 1)浏览器会解析三个东西: ...解析这三种文件会产生一个DOM Tree。 CSS,解析CSS会产生CSS规则树。 Javascript,脚本,主要是通过DOM API和CSSOM API来操作DOM Tree和CSS ...

    从上面这个图中,我们可以看到那么几个事:

    1)浏览器会解析三个东西:
    一个是HTML/SVG/XHTML,事实上,Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。
    CSS,解析CSS会产生CSS规则树。
    Javascript,脚本,主要是通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree.

    2)解析完成后,浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree。注意:
    Rendering Tree 渲染树并不等同于DOM树,因为一些像Header或display:none的东西就没必要放在渲染树中了。
    CSS 的 Rule Tree主要是为了完成匹配并把CSS Rule附加上Rendering Tree上的每个Element。也就是DOM结点。也就是所谓的Frame。
    然后,计算每个Frame(也就是每个Element)的位置,这又叫layout和reflow过程。

    3)最后通过调用操作系统Native GUI的API绘制。

     

    DOM解析

    HTML的DOM Tree解析如下:

    <html>
    <html>
    <head>
    <title>Web page parsing</title>
    </head>
    <body>
    <div>
    <h1>Web page parsing</h1>
    <p>This is an example Web page.</p>
    </div>
    </body>
    </html>

    上面这段HTML会解析成这样:

     

     

    下面是另一个有SVG标签的情况。

     

    CSS解析

    CSS的解析大概是下面这个样子(下面主要说的是Gecko也就是Firefox的玩法),假设我们有下面的HTML文档:

    <doc>
    <title>A few quotes</title>
    <para>
    Franklin said that <quote>"A penny saved is a penny earned."</quote>
    </para>
    <para>
    FDR said <quote>"We have nothing to fear but <span>fear itself.</span>"</quote>
    </para>
    </doc>

     

    于是DOM Tree是这个样子:

     

    然后我们的CSS文档是这样的:

    /* rule 1 */ doc { display: block; text-indent: 1em; }
    /* rule 2 */ title { display: block; font-size: 3em; }
    /* rule 3 */ para { display: block; }
    /* rule 4 */ [class="emph"] { font-style: italic; }

     

    于是我们的CSS Rule Tree会是这个样子:

    注意,图中的第4条规则出现了两次,一次是独立的,一次是在规则3的子结点。所以,我们可以知道,建立CSS Rule Tree是需要比照着DOM Tree来的。CSS匹配DOM Tree主要是从右到左解析CSS的Selector,好多人以为这个事会比较快,其实并不一定。关键还看我们的CSS的Selector怎么写了。

    注意:CSS匹配HTML元素是一个相当复杂和有性能问题的事情。所以,你就会在N多地方看到很多人都告诉你,DOM树要小,CSS尽量用id和class,千万不要过渡层叠下去,……

    通过这两个树,我们可以得到一个叫Style Context Tree,也就是下面这样(把CSS Rule结点Attach到DOM Tree上):

     

     

    所以,Firefox基本上来说是通过CSS 解析 生成 CSS Rule Tree,然后,通过比对DOM生成Style Context Tree,然后Firefox通过把Style Context Tree和其Render Tree(Frame Tree)关联上,就完成了。注意:Render Tree会把一些不可见的结点去除掉。而Firefox中所谓的Frame就是一个DOM结点,不要被其名字所迷惑了。


    注:Webkit不像Firefox要用两个树来干这个,Webkit也有Style对象,它直接把这个Style对象存在了相应的DOM结点上了。


     

    渲染

    渲染的流程基本上如下(黄色的四个步骤):
    计算CSS样式
    构建Render Tree
    Layout – 定位坐标和大小,是否换行,各种position, overflow, z-index属性 ……
    正式开画

     





    CSS森林(CSS Forest): 浏览器工作原理浅析


    浏览器这边做的工作大致分为以下几步:

    加载:根据请求的URL进行域名解析,向服务器发起请求,接收文件(HTML、JS、CSS、图象等)。

    解析:对加载到的资源(HTML、JS、CSS等)进行语法解析,建议相应的内部数据结构(比如HTML的DOM树,JS的(对象)属性表,CSS的样式规则等等)

    渲染:构建渲染树,对各个元素进行位置计算、样式计算等等,然后根据渲染树对页面进行渲染(可以理解为“画”元素)

    这几个过程不是完全孤立的,会有交叉,比如HTML加载后就会进行解析,然后拉取HTML中指定的CSS、JS等。

    展开全文
  • 实时渲染——三种渲染方法介绍

    千次阅读 2017-02-25 11:08:30
    实时渲染,一般有三种渲染方法,多光源一次渲染,多光源多次渲染和延迟着色。多光源一次渲染:对于每个物体,计算所有光源对其的影响来对该物体进行渲染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);

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

    展开全文
  • 渲染

    2019-07-23 16:15:32
    渲染 一.渲染流程有四个主要步骤: 解析HTML生成DOM树 - 渲染引擎首先解析HTML文档,生成DOM树 构建CSSOM树 - 接下来不管是内联式,外联式还是嵌入式引入的CSS样式会被解析生成CSSOM树 构建Render树 - 根据...
  • 2016的渲染

    千次阅读 2016-01-03 13:18:17
    Unity3d PBR海水渲染 三层水 博主15年后半段渲染:最近用unity5弄的一些渲染  ---- by wolf96 http://blog.csdn.net/wolf96
  • 一些游戏用到的渲染技术

    千次阅读 2018-05-18 21:19:57
    泡泡网显卡频道2月19日 近年来3D图形技术的发展势头非常迅猛,软件方面游戏的画面和逼真度有了长足进步,硬件方面显卡的更新换代越来越频繁。但始终存在这样一个现象,无论显卡的性能翻多少倍,游戏玩家们总感觉还是...
  • 网页渲染原理

    千次阅读 2018-10-29 14:49:24
    1. JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力。编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进行完全编译,而解释...
  • BootStrap&LayUI

    2020-05-07 20:44:12
    BootStrap使用 <!... <... <head> <meta charset="utf-8">...--使⽤X-UA-Compatible来设置IE浏览器兼容模式 最新的渲染模式--> <meta http-equiv="X-UA-Compatible" content="IE=...
  • 在上一篇参考如何用 Blender 实现 体积云材质效果 后,这次结合之前的 飞机模型,制作 天空飞行动画 体积云 给飞机周边添加上 体积云材质 的 Cube 添加动画 给 飞机主体、螺旋桨 添加上主体加上 旋转、位移 ...
  • 在three.js中,要渲染物体到网页中,我们需要3个组件:场景scene、相机camera 和渲染器renderer。有了这三样东西,才能将物体渲染到网页中去。 创建这三要素的代码如下 : var scene = new THREE.Scene(); // 场景 ...
  • vue中动态渲染组件

    万次阅读 2020-04-29 15:42:33
    https://blog.csdn.net/qq_42345237/article/details/98348889 https://www.cnblogs.com/moqiutao/p/11440315.html 自己的代码 <template> <div class="top"> ...div class="top_div">......
  • vue中完美实现多组件动态调用渲染

    万次阅读 2020-04-29 16:08:54
    <template> <div class="top"> <div class="top_div"> <div style="background-color:coral;"> <img style="width: 50px;height: 50px" src="../assets/logo.png"&g...
  • 延迟渲染与前向渲染

    千次阅读 2018-12-11 17:58:06
    The basic idea behind deferred shading is to perform all visibility testing before performing any lighting computations. -RealTimeRendering 3rd 延迟着色的基本思想是在执行任何光照计算之前执行所有可见...
  • java爬虫,爬取js渲染完成后的网页

    万次阅读 2020-08-13 05:16:44
    一个是必要的htmlunit框架用来获取渲染完成后的网页 另一个是jsoup爬虫框架,用来获取网页中想要获取的内容 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> &
  • 至2018.1版本,Unity中除了默认渲染管线,还提供了轻量级渲染管线(Lightweight Pipeline)和高清晰渲染管线(HD Pipleline)二个渲染管线。当然也支持自定义渲染管线。与高清晰渲染管线相比,...
  • 游戏开发入门(三)图形渲染

    万次阅读 多人点赞 2018-01-17 22:15:34
    视频链接:游戏开发入门(三)图形渲染(3节课 时常:约2小时20分钟) 视频链接:一堂课学会shader——渲染拓展课程(3节课 时常:约1小时20分钟) 笔记与总结(请先学习视频内容): 游戏开发入门(三)图形...
  • MATLAB三维图形绘制、渲染和交互

    千次阅读 2019-11-21 09:39:22
    MATLAB三维图形渲染和交互操作 视频教程入口 第一章:课程简介 1. 课程简介 4:07 第二章:三维图形的绘制 1. 点 6:16 2. 直线 8:11 3. 面片 17:32 4. 曲面 8:28 5. 文本 5:...
  • 渲染与分布式并行集群渲染技术

    万次阅读 2016-06-20 23:22:56
    第1节 渲染农场基础 1. 集群渲染技术产生的背景 集群计算机(或高性能计算机)通常分为SMP和MPP两种: (1)SMP(symmetric multiprocessing,对称多处理),计算机的I/O总线、多处理器、内存等所有的控制都运行...
  • 渲染基础-渲染管线(Render-pipeline)

    万次阅读 多人点赞 2018-05-25 00:30:00
    一开始学习计算机图形学的小伙伴们肯定对于渲染管线有一点迷茫,至少当初我就有点迷茫,为了能对后来对计算机图形学感兴趣的萌新小伙伴起到一些帮助,在这里简单讲解一下渲染管线(Render-pipeline)。 ===========...

空空如也

1 2 3 4 5 ... 20
收藏数 682,582
精华内容 273,032
关键字:

渲染