热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

图形渲染管线与shader(更新中)

恢(zheng)复(shi)更(kai)新(shi)后的第一天。唔…不如来说说图形管线和着色器的事吧。趁着刚给别人讲完。(说来还是一段惨痛的经历…TAT)(请自行脑补分割线)着

恢(zheng)复(shi)更(kai)新(shi)后的第一天。

唔…不如来说说图形管线和着色器的事吧。趁着刚给别人讲完。(说来还是一段惨痛的经历…TAT)

 

(请自行脑补分割线)

 

着色器,也就是平时各种地方说的shader,是开发者为了开发需求而为GPU(图形处理器)编写的一个小程序。GPU有着高度并行化的特点,但运算的能力就没有CPU那么厉害,无法完成较为复杂的运算。但同时,它往往拥有CPU无法企及的庞大的计算单元数量(Iris 540:48,GTX 980Ti : 2560),这些单元都可以独立完成相关的计算,想想如果有几百个这样的单元在同时计算,计算的效率势必飞涨。不过这样的计算所能完成的工作也是有限的,但是由于图形计算高度的分离性,这种经过特殊设计的硬件成为了"大杀器"。如果把CPU比成一组学识渊博的教授的话,GPU可能更像一操场的中学生 —— 但应付常见的图形计算,老教授们渊博的学识…并没有什么卯月。

我们可以为这样的硬件编写短小的程序,也就是shader。这些程序一般进行的是纯粹的数学计算和简单的逻辑处理,所以通常行数不会超过三位数,但行行是精华,可能某一行的一个算式就是几十年的研究结果。

Unity中支持好几种不同类型的shader,它们被称之为"Surface shader"、"Unlit shader"一类。Unlit shader是其中最"本质"性的一个,它和OpenGL/DirectX/…这类底层图形API所使用的shader没有什么本质性的区别。

(Unity中shader支持的语言是CgHLSL

不想在这里涉及太多具体实现的细节。那么就让我们开始吧,从冷冰冰的数据如何变成屏幕上的一帧帧图像开始。

(一)图形渲染管线

(简化了的图形渲染管线模型)

"图形渲染管线"(Graphics rendering pipeline)指的是从数据被输入GPU开始,到最后渲染成为图像所经历的一系列有序过程的总称。

但首先,我们要能够告诉GPU,我们要画些什么在屏幕上。现在,人们采用顶点+面的方式来描述。我们把一个个复杂的几何体表示为一组面的集合,就像这样:

尽管这样不能完美的表示一个曲面,但对于骗过我们自己的眼睛来讲这足够了。这个茶壶成为了被一个个四边形包围起来的物体,如果我们存下这些四边形的顶点信息,我们就能够根据这些信息画出一个一模一样的"茶壶"。

由于空间中三点确定一个平面,我们不使用四边形,而使用三角形来"包围"一个物体。有了它们各个顶点的数据,我们就可以根据这些数据去绘制我们需要的图形。这些数据被传入GPU,再由GPU进行计算,变成图像呈现给我们。在这些数据中,大多数情况下不单包含顶点的位置信息,往往还有顶点的法向量("朝向",这在计算光照时十分有用。单有位置不能判断出某个顶点的朝向,进而无法判断出这个面上某个点对应屏幕上的像素究竟该不该被照向某个方向的光打亮),纹理坐标(用来给几何体贴图,详见后续)等。

 

有了这些信息,我们需要去把它计算成对应于屏幕上的坐标。在这里需要用到空间上的变换,把一个个坐标点换成相对于眼睛位置、朝向的坐标,并经过透视变换,变成对应于屏幕的坐标点。

(物体的变换过程,注意透视变换产生的"拉伸")

 

在这之后,我们把这些点组装成一个个面,再计算出每个面对应于屏幕上的那些像素。然后根据传入的顶点数据给这些像素分配颜色,最终呈现在屏幕上(或保存在图像中)。一般情况下,这一整套流程要在一秒钟内执行60次以上 —— 通常有万计的顶点;这便是GPU高度并行化可怕的计算效率。

 

(二)顶点着色器(Vertex shader)

在数据被传入后,经过简单的处理,第一个阶段(stage)便是顶点着色器。上文提到"着色器"即shader,是我们为GPU编写的独立的小程序。它分为几种不同的类型,分别用于整个渲染流程的不同阶段。在这一阶段,我们这一段小程序的目的是把输入的顶点位置转化为相对于屏幕的顶点位置(经过透视变换),并可处理数据向后续阶段传递 —— 我们可以很轻松的在后续阶段的shader中拿到之前阶段shader产生的数据。


推荐阅读
  • Python 异步编程:ASGI 服务器与框架详解
    自 Python 3.5 引入 async/await 语法以来,异步编程迅速崛起,吸引了大量开发者的关注。本文将深入探讨 ASGI(异步服务器网关接口)及其在现代 Python Web 开发中的应用,介绍主流的 ASGI 服务器和框架。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • NVIDIA Titan RTX深度评测
    NVIDIA的Titan RTX被誉为当前最强大的桌面显卡之一,其卓越的性能和高昂的价格吸引了众多专业人士和技术爱好者的关注。本文将详细介绍Titan RTX的技术规格、性能表现及应用场景。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • vivo发布iQOO 11系列:搭载骁龙8 Gen2与多项创新技术
    vivo正式推出iQOO 11系列智能手机,该系列搭载最新的高通骁龙8 Gen2处理器,并引入多项创新技术,致力于为用户提供卓越的性能和游戏体验。 ... [详细]
  • 本文介绍百度AI Studio这一集成开发平台,涵盖丰富的AI教程、经典数据集及云端计算资源。通过具体示例——在AI Studio上构建线性回归项目,帮助初学者快速掌握其核心功能与操作方法。 ... [详细]
  • 本文深入探讨了WebGL与Three.js在构建多样化3D场景中的应用,详细解析了两者如何协同工作以实现高性能的3D渲染,并提供了实践指南。 ... [详细]
author-avatar
娱乐老爷_410
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有