【技术美术图形部分】图形渲染管线2.0-GPU管线概述几何阶段

图形渲染管线1.0

【技术美术知识储备】图形渲染管线1.0-基本概念&CPU负责的应用阶段

在上一篇中,从渲染分类开始介绍了什么是渲染流水线、为什么要有流水线以及流水线如何进行的,还介绍了CPU主导的应用阶段的四项小阶段。

这一篇的第1和第2小节主要介绍GPU管线的概念,第3小姐介绍几何处理阶段的顶点着色器、可选的曲面细分着色器和几何着色器、图元装配环节的裁剪和屏幕映射。


1 三个概念阶段与GPU管线

而这三个概念阶段其实是GPU管线(GPU Pipeline)来实现的,参考参考RTR4中的叙述过程:

在第2章节《The Graphics Rendering Pipeline》中,分别给几何阶段、光栅化和像素处理每个概念阶段划分了功能阶段(functional stage)

1.1 几何处理

几何处理阶段负责绝大部分逐三角形和逐顶点的操作,进一步划分为顶点着色 Vertex Shading投影  Projection剪裁 Clipping屏幕映射 Screen Mapping四个功能阶段,3rd版本还在顶点着色前加了模型视点变换 Model&View Transform功能阶段。

1.2 光栅化&像素处理

几何处理阶段给定了变换和投影的顶点及其数据,光栅化阶段的目的是找到渲染图元内的所有像素,光栅化进一步划分为三角形设置 Triangel Setup三角形遍历 Triangle Traversal两个功能阶段。

找到了所有像素后,进入了像素处理阶段,进一步划分为了像素着色 Pixel Shading像素合并 Merging两个功能阶段。

2 GPU管线 GPU Pipeline

在第3章节3.2《GPU Pipeline Overview》中将上述三个概念阶段,分为了一系列硬件阶段(hardware stage),具有不同程度的可配置性或可编程性。

Note that these physical stages are split up somewhat differently than the functional stages presented in Chapter 2.注意,这几个物理阶段跟第2章中介绍的功能阶段有所不同。

——《Real-Time Rendering 4th》

而1.1和1.2展示的正是上述所说的功能阶段,整个GPU管线划分成的一系列硬件阶段如下所示:

其中,绿色表示完全可编程,其中实线表示Shader需要开发者自己编程实现,虚线代表是可选的

蓝色表示该阶段完全由GPU固定实现(开发没有控制权)

黄色表示可进行配置但不是可编程的

可编程着色器让GPU管线更加灵活、可控。

DirectX和OpenGL命名方式的小区别

注意,以上出现的一些名称几乎是DirectX的命名方式,但OpenGL和DirectX在命名上也稍有不同。例如,DirectX的像素着色器(Pixel Shader)在OpenGL中是片元着色器(Fragment Shader),而片元着色器更加适合描述这一阶段,因为在进行片元着色器阶段时,此时的片元并不是完全意义上的像素。

同样,上述用DirectX描述的输出合并阶段(Merger)在OpenGL中是逐片元操作(Pre-Fragment Operations),一个重在体现阶段的目的,一个重在体现阶段的操作对象。

避免之后混乱,这里统一一下本篇博客之后的说法:

Pixel Shader和Fragment Shader会选择片元着色器Fragment Shader

Merger和Pre-Fragment Operations会选择逐片元操作 Pre-Fragment Operations

之前管线里的说法仍延续,就不更改前面的了。 


从第3节开始,逐一对各个硬件阶段进行介绍,很大部分参考了《入门精要》和RTR4的叙述。

3 顶点着色器 Vertex Shader

就是字面意思,顶点着色器用以完成顶点着色(Vertex Shading)。顶点着色器与后面的片元着色器一起,都是可动态编程的。动态编程的实现由脚本提供,而脚本能写起来是有对应的着色语言支撑的,常见的着色语言有DirectX的HLSL、OpenGL的GLSL等等。

3.1 着色和顶点着色

我们知道渲染过程中,除了模型的大小和位置,还需要进行模型好看外观的渲染,这里涉及到材质以及光源下材质展现的光照效果,而渲染中确定材质光照效果的过程就是着色,即Shading。

顶点着色——着色往往在每个顶点需要计算着色方程(Shading Equation),这些着色需要的信息就是在之前的应用阶段CPU为GPU提供的渲染状态里说包含的信息。顶点着色的结果会被输出给后续的环节进行插值等操作。

3.2 顶点着色器的输入和输出

顶点着色器分为输入和输出两个部分,输入的内容就是CPU传递过来的顶点信息,实现了主要功能后再输出出去。例如OpenGL中输入参数体现为属性(Attribute)统一值(Uniforms)采样器(Samplers)等等,输出参数体现为可变变量(Varying),以及gl_Position等等。

主要功能就是基于输入的信息完成坐标变换逐顶点光照

3.3 必须进行的坐标变换

GPU对每个输入网格顶点都会调用一次顶点着色器,进行矩阵变换位置,对于坐标变换必须完成的一项工作是——把顶点坐标从模型空间转换到齐次裁剪空间

o.pos = mul(UNITY_MVP, v.position);

 类似以上这句代码,就是在把顶点坐标转换成齐次裁剪坐标系下,进行齐次空间裁剪输出后再由硬件做透视除法(顶点坐标/w)得到归一化设备坐标NDC(Normalized Device Coordinates)下的坐标。看到这里熟悉了吗?没错!这就是101最开始在正交和透视投影那块儿讲到的内容。 

除了这一步必须要完成的操作,坐标变换还可以改变顶点的位置,这一步在顶点动画中是非常有用的,例如模拟水面、布料等。

3.4 顶带着色器完成的着色

当需要进行光照计算时,顶点着色器还需要计算光照公式生成顶点颜色并得到纹理坐标。

3.5 输出信息给谁

一般的,顶点着色器会把完成坐标变换的位置和纹理坐标这种参数信息发送给片元着色器。除了片元着色器外,还可以把参数信息传递给曲面细分着色器或者几何着色器,也就是上述硬件阶段的绿色部分接下来的两个环节,但这两个环节并不是必须的。

4 曲面细分着色器 Tessellation Shader-TSS

这部分仅简单介绍,百人计划后续会有章节对曲面细分和几何着色器详细的学习:【技术美术百人计划】图形 3.3 曲面细分与几何着色器 大规模草渲染

与必须有的顶点着色器不同,曲面细分着色器是可选的,用于实现渲染图元的细分。将复杂的曲面转换为简单的点、线、三角形等,增加原有模型的顶点(vertex)数量,再用位移贴图(displacement mapping)真实地更改顶点高度信息,从而增加模型细节。

4.1 优点

4.1.1 节省宽带

有了曲面细分着色器,不用加载高面数的高模(high-poly),可以实现应用阶段提到的动态LOD技术

4.1.2 节省内存 

还是从模型高、低角度出发,有了曲面细分着色器,我们可以只保存低模的mesh,在需要增加表面细节的时候使用曲面细分着色器就行!这样就不需要占用特别大的内存来储存高面数的模型。

4.2 应用

这部分图均来自技术美术百人计划图形3.3中的内容。

4.2.1 与位移贴图(置换贴图)结合应用

4.2.2 海浪、雪地脚印等

4.3 组成部分

曲面细分着色器可以分为:曲面细分控制器(Tessellation Control Shader)曲面细分引擎(The Tessellation Engine)曲面细分求值着色器(Tessellation Evaluation Shader)

5 几何着色器 Geometry Shader-GS

同理,这部分仅简单介绍,百人计划后续会有章节对曲面细分和几何着色器详细的学习:【技术美术百人计划】图形 3.3 曲面细分与几何着色器 大规模草渲染

与曲面细分着色器一样,几何着色器也是可选的部分。几何着色器主要是用来进行几何的绘制,将图元转换成其他图元,例如:三角形的mesh -> 线框,线框 -> 实体化等等,这些都是曲面细分着色器无法做到的。

但并非所有GPU都支持几何着色,例如一般手机都是不支持几何着色的。

应用

下图是rtr4中的例图:图1是利用GS给球做一些变形,图2是用GS和stream out实现闪电,图3是布料模拟,也是通过GS实现的。

 百人计划课程中还提到的其他应用:做一些简单的几何动画,爆破、破碎之类的效果,以及与TSS结合动态控制一片草的密度。

(如下图,来自渲染管线与GPU(Shading前置知识) - 知乎 (zhihu.com))

6 裁剪 Clipping

有些地方把裁剪和后面的屏幕映射一起称为图元装配(Primitive Assembly)环节。

首先咱们再来看看GPU渲染管线的顺序,裁剪阶段和三角形设置、三角形遍历是由GPU的固定功能硬件(fixed-function hardware)实现的,不可编程也不可自行配置,我们没有控制权

6.1 裁剪的目的

图元与摄像机视野的关系有:

  • 完全在视野内
  • 部分在视野内(这种情况才需要被裁剪
  • 完全在视野外

只有全部或者部分在视觉空间内的图元才会被传入后续的阶段并最终渲染到屏幕上。当面对超级大场景时,渲染场景中的全部图元很显然是不可取的,一个常见的想法是——仅渲染在摄像机视野范围内的图元,而在视野范围外的图元就需要被剔除掉,这就是裁剪这一阶段进行的工作。

6.2 裁剪在GPU管线中的位置

这部分参考了一篇文章彻底弄懂齐次裁剪 - 知乎 (zhihu.com)

由上述顺序图可以看出,裁剪是发生在透视投影之后,齐次除法或透视除法(顶点坐标/w)之前的操作,裁剪使用的是四维的齐次裁剪坐标。

个人认为,裁剪的范围是在透视除法后确定的,但裁剪这个操作是在透视除法前。

6.3 齐次空间裁剪

6.3.1 普通裁剪(透视除法后裁剪)的不足

首先再过一遍透视投影、齐次空间和透视除法的概念。

  • 透视投影

就是顶点着色器中的坐标变换阶段会进行的,透视投影得到的是齐次坐标,往往是(x, y, z, w)这么个形式。

  • 齐次坐标

齐次坐标(homogeneous coordinate),它是齐次坐标空间(homogeneous space)下的一个四维矢量(事实上维度可以超出4维),能表示平行线在透视空间的无穷远处交于一点,也就是能把无穷远处的点表达出来:(1, 2) -> (1, 2, 0)。这部分参考了为什么要引入齐次坐标,齐次坐标的意义(一)

  • 透视除法

将齐次坐标转换为三维坐标,即:坐标/齐次分量w。

普通裁剪就是在进行MVP透视投影后后直接进入透视除法——将三维空间范围直接转换到[-1, 1]³的NDC标准立方体范围。遍历每个顶点,如果有一个顶点超出了这个标准立方体范围,就将这个顶点所在的三角形mesh完全剔除。

这种方法虽然简单粗暴,但由于在透视除法之后进行裁剪,将无法运用线性插值做插值处理,最终展示在屏幕上的图像并不平滑,会有很多突兀的残缺部分。而如果我们选择在齐次空间就进行裁剪,就能运用线性插值做插值处理啦!得到的图像细节部分将有平滑过渡。

6.3.2 齐次空间裁剪大概步骤

参考了: GPU在进行vertex shading之后,rasterization之前,是怎么剪裁的? - 知乎 (zhihu.com)

  • 经过投影得到齐次坐标
  • 根据规范化立方体NDC下顶点位置确定需要裁剪的图元,并求得需要在齐次空间进行插值的参数
  • 利用这个参数在齐次空间中对该点进行线性插值,插值的参数包括坐标、纹理坐标、颜色值等等

7 屏幕映射 Screen Mapping

还记得裁剪之后进行透视除法获得的坐标,是一个NDC下的单位立方体范围内的三维坐标。输入三维的顶点信息后,屏幕映射就是把每个图元的x和y坐标转换到屏幕坐标系(Screen Coordiantes)下。屏幕坐标系是一个二维坐标,与显示画面的分辨率有很大关系,它和z坐标一起构成了窗口坐标系(Window Coordinates)。

7.1 “缩放”

如下图所示的屏幕映射过程,不难发现:屏幕映射其实就是一个缩放的过程!而且这个缩放是针对x和y坐标而言的,对z坐标不进行任何操作。

7.2  OpenGL和DirectX的屏幕坐标系差异

OpenGL支持笛卡尔坐标系,左下角为最小的(0, 0);而微软的DirectX考虑到用户的“上到下、左到右”阅读习惯,定义左上角为最小的(0, 0)。

我们要留意引擎基于的API,在API之间传递时要注意这点差异。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41714.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GIS小案例】CesiumHeatmap热力图

1&#xff0c;CesiumHeatmap&#xff1a; GitHub - danwild/CesiumHeatmap: A library to add heatmaps (using heatmap.js) to the Cesium framework. 2&#xff0c;效果图 3&#xff0c;示例代码 <!DOCTYPE html> <html lang"en"><head><m…

UE 实时地形高度检测(一)。利用虚拟纹理(virtualTexture)低成本生成热力图/高度图/等高线。

哈喽&#xff01; 近期可能会继续撰写一些文章&#xff0c;来丰富自己工作之余的生活&#xff0c;弥补没有项目的遗憾。 如标题所见&#xff0c;这个又是一个智慧城市常见的功能&#xff1a;“热力图、高度图”。 利用虚幻 新功能&#xff1a;“虚拟纹理&#xff08;VirtualTex…

openlayers学习——15、openlayers加载热力图

openlayers加载热力图 前言&#xff1a;基于Vue&#xff0c;学习openlayers&#xff0c;根据官网demo&#xff0c;记录常用功能写法。本人不是专业GIS开发&#xff0c;只是记录&#xff0c;方便后续查找。参考资料&#xff1a; openlayers官网&#xff1a;https://openlayers.o…

NGUI使用教程(3) 使用外部图片制作Atlas(图集)

在实际操作之前有几个概念先弄清一下 Atlas:图集,把美术给你提供的素材,用 NGUI 的 Atlas Maker 工具&#xff0c;合成一张图片&#xff08;准确的说,还同时生成了prefab、mat &#xff09;。 Sprite:精灵,由于Atlas已经把你的图片都合成一张了&#xff0c;那怎么单独调用呢&…

图形引擎实战:HDRP移动版高清渲染管线改造

前言 近年来&#xff0c;随着移动平台硬件的性能不断提升&#xff0c;移动端游戏采用的渲染技术更加先进&#xff0c;整个行业对画质效果的需求也越来越大&#xff0c;我们借此做了一些技术尝试&#xff0c;测试了Unity HDRP是否可以在移动端跑起来&#xff0c;结果是可行的。…

UE 实时地形高度检测(二)。利用Niagara及虚拟纹理(virtualTexture)生成动态——立体的热力图。

接上文&#xff0c;利用Niagara 粒子的特性&#xff0c;来动态生成三维热力图&#xff0c;高程图&#xff01; 传统的平面热力图已经很清晰的表达出热力的效果了。 但是&#xff0c;在三维引擎中&#xff0c;看起来没有那么的炫酷&#xff0c;那就增加第三个维度Z轴&#xff…

3D-echarts的背景和地图表面的贴图

1.设置背景图片 效果如下&#xff1a; 核心代码&#xff08;全部代码见文末&#xff09;&#xff1a; 注意&#xff1a;图片的路径设置 绝对路径 或 asset下面的相对路径都没有效果&#xff0c;要把图片放到public路径下面才有效果&#xff08;此demo是写在v2脚手架中&#xf…

Unity中画2D图表(1)——用XChart包绘制折线图

做一些数据处理和数据分析的时候&#xff0c;把数据可视化是一项重要的工作&#xff0c;本例以画一个包含两条温度曲线的图开始… 一、折线图的绘制效果 二、用到的包 1、XChart介绍 2、XChart官方链接 https://github.com/XCharts-Team/XCharts 三、如何用代码来设置线条…

[计算机图形学]渲染管线,纹理映射(前瞻预习/复习回顾)

一、渲染管线 目前为止&#xff0c;我们前几篇的介绍当中已经把一个3D场景转换到2D的过程几乎讲完了&#xff0c;而这么一个过程就被称为Real-time Rendering Pipeline也就是实时渲染管线&#xff0c;也就是一个流水线。其中包括顶点的变换&#xff0c;光栅化&#xff0c;片元操…

Unity 之图形渲染(一)

备注&#xff1a;希望和大家一起交流学习&#xff0c;如果有不同的观点欢迎一起讨论学习&#xff0c;不喜勿喷&#xff0c;谢谢。 unity图形渲染 前提MeshMesh FilterMesh Renderer基本属性 Skinned Mesh Renderer基本属性 前提 unity 中图形渲染组件主要有三种&#xff1a; …

在Unity中制作逼真的建筑场景

原创 Unity Unity官方平台 2018-07-28 在创作游戏中&#xff0c;场景的制作是必须要面对的问题&#xff0c;如何高效制作好感染力强、让人印象深刻的场景是每个开发者都会面临的难题&#xff0c;因为场景的细节和逼真度处理起来并不简单。 本篇文章中&#xff0c;游戏开发工程…

【项目展示】Unity 海洋场景渲染(Boat Attack Water、光谱渲染)

项目背景 前几个月开始做的项目&#xff0c;需要一个使用海洋场景。但是因为项目很急&#xff0c;所以海水需要使用别人已经写好的开源代码。当时就想起了Unity曾经有一个URP宣传片中的海水似乎还不错&#xff0c;于是便基于此项目的海水进行修改&#xff08;Unity在GitHub上有…

渲染的艺术:建筑效果图渲染的5个成功要素

在数字建筑可视化的早期&#xff0c;建筑物只是简单地填充了与不同活动和规模相对应的人体剪裁。现在&#xff0c;随着图像编辑软件的进步&#xff0c;创建建筑渲染不仅仅涉及对建筑物进行 3D 建模然后对其进行抛光。艺术家们正在探索创造性的途径&#xff0c;在一个框架中讲述…

Unity接入ChartAndGraph图表插件

Unity中接入ChartAndGraph图表插件 说明一、实现柱状图二、实现折线图 遇到的问题 说明 最近项目上需要实现部分图表数据显示&#xff0c;因为需要用到一些3D图表&#xff0c;所以选择了ChartAndGraph这款图表插件&#xff0c;图表数据是通过后台接口读取Json并解析,然后调用图…

【Unity】Unity插件:地形编辑器MTE(Mesh Terrain Editor)

文章目录 地形编辑器MTE下载方式文档及教程主要功能地表类型创建工具示例文件创建地图绘制地图快捷键提升、降低高度绘制高度平滑高度绘制纹理 细节问题处理 地形编辑器MTE MTE&#xff08;Mesh Terrain Editor&#xff09;是一款Unity的地形编辑器插件&#xff0c;该插件能够…

unity基础开发----NGUI图集Atlas制作简介

此教程属于 NGUI 的具体操作&#xff0c;主要描述怎么制作一个游戏中的 UI &#xff0c;相对来说比较简单&#xff0c;熟能生巧哇&#xff0c;动手操作一遍就可以完全掌握的。 1 &#xff0c;在 PS 里面设计好要做的 UI &#xff0c;然后切片成很多个 png 的图片&#xff08;这…

图形渲染技术分享:《GTA V 》图形分析摘要

环境渲染 最外层的 cubemap 是每一帧实时生成的&#xff0c;目的是简化后续真实反射的渲染。这个 cubemap 是一张低精度的 128*128 纹理&#xff0c;每个面 30 左右 drawcall&#xff0c;都是地表天空等较大像素贡献的多边形全部是静态物体&#xff0c;所以车辆的外壳反射不…

GaussDB火焰图分析

目录 问题描述问题现象告警业务影响原因分析处理方法 问题描述 CPU利用率是衡量系统负载和健康度的重要指标之一&#xff0c;系统在运行过程中时常发生CPU利用率高的情况。在分析性能问题时&#xff0c;可通过火焰图查看CPU耗时&#xff0c;了解瓶颈在哪里。 问题现象 部分s…

3.15 数据库吐槽大会

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 大家好&#xff0c;我是一名狂热的数据库程序员&#xff0c;趁着 3.15 的良辰吉日&#xff0c;鼓起勇气站上了数据库吐槽大会舞台&#xff0c;以下故事纯属虚构&#xff0c;如有雷同&#xff0c;请对号入座。 名不副实的数据…

一个月涨粉翻倍,摄影博主慌了:照片都是假的,肖像根本不是人

白交 发自 凹非寺量子位 | 公众号 QbitAI 一个月内涨粉翻倍&#xff0c;摄影博主却慌了&#xff0c;忍不住坦白&#xff1a; 我的照片都是AI生成的。 去年十月份开始&#xff0c;这个名叫Jos Avery的大哥&#xff08;后面简称乔大哥&#xff09;开始在社交网络上发照片&#xf…