翻阅了很多资料,也做了不少笔记,决定还是对渲染进行一个总结,以巩固所学的东西。

《Real-Time Rendering, Third Edition》   (PDF的配图链接)将一个渲染流程分为三个阶段:

应用阶段(PApplication Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)

我借用《Unity Shader入门精要》的网页贴图来说明

颜色表示了不同阶段的可配置性或可编程性:绿色表示该流水线阶段是完全可编程控制的,黄色表示该流水线阶段可以配置但不是可编程的,蓝色表示该流水线阶段是由GPU固定实现的,开发者没有任何控制权。实线表示该shader必须由开发者编程实现,虚线表示该Shader是可选的。

顶点着色器(Vertex Shader)、片元着色器(Fragment Shader)是我们编写 Shader最常用的二个。另外二个曲面细分着色器(Tessellation Shader)、几何着色器(Geometry Shader)都是可选着色器。

既然提到了着色器(Shader),那什么是Shader呢

A shader is a piece of code, that is executed on the GPU. The engine feeds it with 3d model vertices, textures and other information, and gets back from it pixel colours.
-- from What is a Shader?

翻译过来:Shader 就是运行在GPU上的一段代码,引擎提供给它3D的模型顶点、纹理和其它信息,并获取返回的像素颜色。

Draw Call又是什么呢

A draw call is a command to render one mesh. It is given by the CPU. It is received by the GPU. The command only points to a mesh which shall be rendered and doesn’t contain any material information since these are already defined via the render state. The mesh resides at this point in the memory of your graphic card (VRAM).

-- from renderhell-book1

有兴趣可以观看下面这个视频,很形象和生动。

视频地址:

https://data.simonschreibt.de/gat049/cpu_calls_gpu.webm

https://data.simonschreibt.de/gat049/commandbuffer_communication_chunk.webm

实际上,Draw Call就是一个命令,它的发起方是CPU,接收方是GPU。这个命令仅仅会指向一个需要被渲染的图元(primitives)列表,而不会再包含任何材质信息(这些信息已经在渲染状态中被定义了),此时网格是驻留在显存(Video Random Access Memory)中的。

当给定了一个Draw Call时,GPU就会根据渲染状态(例如材质、纹理、着色器等)和所有输入的顶点数据来进行计算,最终输出成屏幕上所显示的那些像素。

只看文字不免过于抽象,我之前在网上看到一张图,描述的挺不错。

而实际的工作比这个要复杂很多,包括:坐标转换、透视、裁剪等一系列操作。

所上图所示,需要历经:坐标转换(模型空间 –> 齐次裁剪空间),逐顶点光照,透视除法(归一化的设备坐标 —— Normalized Device Coordinates, NDC),裁剪,屏幕映射。

这里再多解释一下,何为齐次裁剪空间。齐次裁剪空间是一个中心点是坐标原点的立方体,xyz取值范围是[-1, 1]。使用一个4x4的齐次变换矩阵将点从摄像机坐标空间变换到齐次裁剪空间,将顶点的深度值z保存在顶点经过变换得到的齐次坐标的w分量中。最后,把顶点在齐次空间中的坐标通过将x,y,z分量除以w分量的方式,将齐次坐标转为NDC。

为什么需要使用NDC呢?为了适配屏幕的多分辨率问题。

归一化坐标中,两个轴其中一个轴的范围是由0至1(但不能两个都是0~1),而且能轻易缩放至不同分辨率下的像素单位。假设把y轴的范围设置为0.0 ~ 1.0,当使用4:3长宽比时,x轴的范围就是0.0至1.333(=4/3),而16:9时x轴的范围则是0.0 ~ 1.777(=16/9),这样就不会出现拉伸了。

接下来就进入光栅化阶段了。

接收顶点信息,进行适当的转换后,对顶点进行插值处理,然后对三角形进行遍历,检查每个网格是否被三角形覆盖,如果被覆盖就会生成一个片元。之后交给片元着色器(在DirectX中,也称为像素着色器 Pixel Shader)。

经过片元着色器(Fragment Shader)处理后,得到一个或者多个颜色值(如下图所示)。

之后进入逐片元操作(Per-Fragment Operations),会经过模板测试(Stencil Test)、深度测试(Depth Test)、混合(Blend)等一系列操作,最后得到的结果(一系列颜色值)存放到帧缓冲区,供GPU进行屏幕的更新。

大体的渲染过程就如上所述。中间忽略了不少信息,如坐标转换(主要使用矩阵、四元数,矩阵就是映射),还有投影(正交/平行投影、透视投影),以及光照模型(各种贴图和法线、切线等)。整个过程中裁剪不仅仅只发生在应用阶段,背面剔除、遮挡剔除(光栅化阶段)都使用了裁剪。也没有提及为什么是减少Draw Call,以及如何优化。

先大体理解整个脉络,中间每一个点都可以单独写很多内容,但是总的流程是这样的。对整个渲染流程,时刻要在脑海中有一个比较清晰的认识和了解,不然很容易被各种转换和模型给搞晕,不知道当前处于什么阶段,输入是什么,输出又是什么,接下来要怎么走。

转载于:https://www.cnblogs.com/meteoric_cry/p/7979323.html

Shader、Draw Call和渲染管线(Rendering Pipeline)相关推荐

  1. 【《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/70544201 这篇文章是解析计算机图 ...

  2. 【转载】《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

    本文由@浅墨_毛星云 出品.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/70544201 这篇文章是解析计算机图形学界" ...

  3. 《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第二章 渲染管线 The Graphics Rendering Pipeline

    写在前面的话:因为英语不好,所以看得慢,所以还不如索性按自己的理解简单粗糙翻译一遍,就当是自己的读书笔记了.不对之处甚多,以后理解深刻了,英语好了再回来修改.相信花在本书上的时间和精力是值得的. -- ...

  4. opengl渲染管线(Graphics Pipeline)

    opengl渲染管线 前言:在OpenGL中,任何事物都在3D空间中,但是屏幕和窗口都是2D像素数组,因此OpenGL大部分工作都是将3D坐标转化为适应屏幕的2D像素.3D坐标转化为2D坐标的过程是O ...

  5. 《Real-Time Rendering 4th Edition》全文翻译 - 第1章 引言

    为了追赶同事(或者在公司装X),不得不开始啃RTR4(滑稽) 如题,用笨办法硬上,就是莽! 然后是概括一下每小节大致内容,最后翻译全文. 这样把全书过一遍的话应该能算认真读完了吧-- 全文翻译,逐字逐 ...

  6. 《视觉开发专题》之 OpenGL 概述

    这是 视觉专题 的第一篇,将分为: 什么是 OpenGL OpenGL 语法说明 OpenGL 渲染管线 OpenGL 程序&渲染流程分析 这几个小模块来一一介绍,阅读完本篇内容你将收获: O ...

  7. Godot着色器基础

    原文地址:Docs>Shading>Shading reference>Shaders 简介 着色器是一种运行在GPU上的独特程序.它们会决定如何拾取网格模型的数据(诸如顶点位置,颜 ...

  8. [OpenGL红宝书]第一章 OpenGL概述

    第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向Op ...

  9. 【《Real-Time Rendering 3rd》 提炼总结】(十二) 渲染管线优化方法论:从瓶颈定位到优化策略

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处.   文章链接: https://zhuanlan.zhihu.com/p/32928016 这是一篇很特殊的文章.它将会是这个系列文章主线 ...

  10. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(十二) 渲染管线优化方法论:从瓶颈定位到优化策略

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处.   文章链接: https://zhuanlan.zhihu.com/p/32928016 这是一篇很特殊的文章.它将会是这个系列文章主线 ...

最新文章

  1. 中两个查询结果相减_MySQL 在查询结果中插入伪行
  2. CF1313D:Happy New Year(状压dp)
  3. mysql按日、周、月、年分别统计数据
  4. IntelliJ IDEA 快捷键 Windows
  5. SAS的SQL过程(SQL Procedure in SAS)(一)
  6. 恒凯USB数据采集卡在国产麒麟操作系统下的应用(四)QT环境设置及数据采集实验
  7. leaflet 把图片放到地图上L.imageTransform或者L.imageOverlay.rotated,把视频放到地图上L.videooverlay,把geoJson放到地图上,
  8. A+B 输入输出练习VIII
  9. 如何消除文法的二义性
  10. 使用Mysql Navcat导出查询数据excel时出现数据丢失
  11. WIFI关键器件选型
  12. Dijkstra 与 Floyd算法
  13. linux磁盘爆满如何查询
  14. Netty的UDP广播发送与接收
  15. 智方3000系快餐店管理系统 手机软件下载
  16. mp4视频文件如何转为MP3音频文件
  17. vue实现swiper两端小中间大的效果 圆形
  18. java 静态类 new_Java之静态内部类(static class)
  19. 小肚皮最新版本_小肚皮最新版|小肚皮app安卓版V5.14 _当游网
  20. 怎么降低虚拟内存的使用率

热门文章

  1. mysql自动跑sql发邮件_SQL server 表数据改变触发发送邮件的方法
  2. linux桌面系统开启wifi,8089B开启Wifi的方法(默认的红旗linux系统)
  3. 【Gym-100085 E】Eve【模拟题】
  4. LaTeX在数学环境中使用直立体
  5. 2020-8-4 Codeforces摸鱼报告
  6. 加载字典文件,扫描网站潜在目录
  7. 计算机与信息安全基本概念和知识,第8章计算机网络应用与信息安全知识.ppt
  8. PKUWC2018 5/6
  9. 微信公众号之接入微信公众号服务器开发(二)
  10. uwsgi怎么启动停止