写点什么

通过 OpenGL 理解前端渲染原理(1)

  • 2020-02-11
  • 本文字数:1657 字

    阅读完需:约 5 分钟

通过OpenGL理解前端渲染原理(1)

一、OpenGL

OpenGL,是一套绘制 3D 图形的 API,当然它也可以用来绘制 2D 的物体。OpenGL 有一大套可以用来操作模型和图片的函数,通常编写 OpenGL 库的人是显卡的制造者。我们买的显卡都支持特定版本的 OpenGL。


下图是用 OpenGL 做的旋转的立方体。


1554890391091076623.png

二、渲染原理

渲染管道

在 OpenGL 中,所有东西都在一个 3D 的空间里,而我们的屏幕和窗口都是 2D 的,所以 OpenGL 需要将 3D 的坐标转换成 2D 的坐标,做这件事的是 OpenGL 中的渲染管道(graphics pipeline)。


渲染管道可以分成两大部分:第一部分将 3D 坐标转换成 2D 坐标;第二部分把 2D 的坐标转换成实际的像素。

着色器

通常来说,渲染管道把一组 3D 坐标转换成屏幕上带有颜色的 2D 像素需要经过很多步。上一步的输出作为下一步的输入,所有步骤都是高度专一的,每步都有一个特定的函数,且可以很容易地并发执行。显卡有数千个处理核心来快速处理渲染管道中的数据,而这些是在每个步骤中通过运行在 GPU 上的多个小程序来处理的,这些小的程序被称之为程序着色器(shader)。


其中的一些着色器是可以配置的,开发者可以根据需求配置自己的着色器去替代已经存在的那些,这就让我们能够更自由和细粒度地控制渲染的过程。同时,因为它们运行在 GPU 上,又给我们保留了珍贵的 GPU 时间,在平时的开发中,我们也要充分利用 GPU 渲染来提高软件性能。


着色器通常使用 GLSL 来写,全称是 OpenGL Shading Language。

举个例子

下图展示了一个抽象的渲染管线中的步骤,其中蓝色部分是我们可以注入自己的着色器。


1554890403444014526.png


通过上图我们发现,要把顶点数据转换成全渲染的像素要经过很多步,接下来我们对每一个步骤和代码进行简单的解释。


我们在渲染管线中传入一组可以组成三角形的 3D 坐标数据,这组数据即顶点数据。顶点数据是顶点的集合,而一个顶点是一个 3D 坐标的集合。


渲染管线的第一步是顶点着色器(Vertex Shader)。我们这里传入的是一个简单的顶点,顶点着色器可以让我们做一些基础的处理操作,比如顶点的属性。


在初始装配阶段,也就是 Shape Assembly 阶段,从顶点着色器中输出的顶点会形成一个原始的形状。本例中,输出的顶点形成的是一个三角形。


从初始装配阶段到 geometry shader 阶段,我们可以通过发散其他顶点来形成新的图形,本例中形成了第二个三角形。


在 Tessellation Shader 阶段,可以把上一阶段给出的原型图再分割成若干个小的原型图。本例中,可以形成更多的三角形来创造一个更加平坦、顺滑的环境。这么说可能难以理解,我们结合下图来进一步阐述,这就是细分曲面着色器的作用。


细分曲面着色器的下一阶段是光栅化阶段(Rasterzation stage),在这一阶段会对最终的原型和呈现在屏幕上的对应像素做一个映射,形成 fragment,供下一阶段的 fragment shader 使用。


1554890428321016503.png


Fragment shader 最主要的使命是计算出一个像素的最终颜色,在这个阶段我们可以使用 OpenGL 中一些高级的特效。通常 fragment shader 会包含 3D 界面的多个数据,包括灯光、阴影、颜色等等。


当所有对应的颜色都确定以后,最终的原型将会被传入最后一个步骤,我们称之为 Alpha test and blending 阶段。这个阶段会判断相应的深度,比如一个物体可能在另一个物体的后面,那它可能采用其他的颜色;或者如果该物体被遮挡,可能会被裁掉。


如上文所述,我们可以看到整个渲染管线的步骤和逻辑是十分复杂的,这其中包含了很多个可以改变的步骤,但我们一般只操作 Vertex Shader 和 fragment shader,其他的着色器我们会直接采用默认的。在实际的 OpenGL 编程中,我们至少需要定义一个 Vertex Shader 和 Fragment shader。(需要说明的是,OpenGL 3.1 之前的版本包含了固定管线,从 3.1 版本开始,固定管线从核心中删掉了,因此我们必须使用着色器去工作)。

三、总结

本文为该系列文章的第一篇,先简单介绍 OpenGL 的一些原理,后续文章中会添加新的代码分析,包括着色器(Shader)、纹理(Textture)、变形(transformation)、坐标系统(Coordinate systems)、相机(Camera)等。


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/232


2020-02-11 20:231891

评论

发布
暂无评论
发现更多内容

Velocity不用愁!Velocity系统的前端工程化之路 | 京东云技术团队

京东科技开发者

Java 前端工程化 Web H5 Velocity.js 企业号 5 月 PK 榜

涅槃重生!字节大牛力荐大型分布式手册,凤凰架构让你浴火成神

Java你猿哥

架构 Kubernetes 分布式 架构师 分布式架构

Scrum的三个工件(产品Backlog、Sprint Backlog、产品增量 )

顿顿顿

Scrum 敏捷 敏捷开发管理 敏捷开发管理工具

Elasticsearch与Clickhouse数据存储对比 | 京东云技术团队

京东科技开发者

数据库 elasticsearch Clickhouse 企业号 5 月 PK 榜

混沌演练实践(二)-支付加挂链路演练 | 京东云技术团队

京东科技开发者

微服务 混沌工程 混沌工程实践 企业号 5 月 PK 榜

ps vs top:CPU占用率统计的两种不同方式

极限实验室

Linux 运维 监控系统 INFINI Console

为什么老有人想让我们“程序员”失业?征文获奖作品合集

InfoQ写作社区官方

技术专题合集 热门活动 三周年征文

SpringBoot + Docker 实现一次构建到处运行

Java你猿哥

Java Docker Spring Boot ssm 容器化部署

浅谈财务共享未来发展趋势

用友BIP

业财融合 财务共享

2023最新版Java面试八股文大全(附各大厂面试真题及答案)

采菊东篱下

java面试

还在服务器上捞日志?试试这款可视化监控系统吧,真香!

Java你猿哥

Java 日志 ssm 监控系统 Frostmourne

AntDB数据库参加开源数据库技术沙龙,分享全栈业务能力

亚信AntDB数据库

AntDB AntDB数据库 企业号 5 月 PK 榜

深度学习基础入门篇-序列模型:[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解

汀丶人工智能

人工智能 深度学习 RNN LSTM GRU

龙博机电:90后“厂二代”,靠伙伴云零代码让中小制造业实现数字化“逆袭”

联营汇聚

阿里巴巴亿级并发系统设计手册已开源(2023 最新版)震撼来袭

架构师之道

Java 高并发

全新一代小度智能屏X9焕新上市 正式开启预售

Geek_2d6073

云图说丨初识商标注册服务

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

40亿个QQ号,限制1G内存,如何去重?

Java你猿哥

Java ssm 布隆过滤器 BitMap 过滤器

WorkPlus AI助理 | 将企业业务场景与ChatGPT结合

WorkPlus

百度工程师移动开发避坑指南——Swift语言篇

百度Geek说

swift 移动端 开发语言 企业号 5 月 PK 榜

我用ChatGPT,给RabbitMQ加了个连接池

Java你猿哥

Java 源码 ssm RabbitMQ ChatGPT

胜面试官半子!阿里SpringBoot全栈笔记首发,源码实战齐飞

做梦都在改BUG

Java spring 微服务 Spring Boot 框架

深度学习进阶篇-预训练模型[1]:预训练分词Subword、ELMo、Transformer模型原理;结构;技巧以及应用详解

汀丶人工智能

人工智能 深度学习 预训练模型 Transformer ELMo

最高奖金100万!第二届广州·琶洲算法大赛火热报名中

飞桨PaddlePaddle

百度飞桨 算法大赛

不吹不黑!阿里新产微服务架构进阶笔记我粉了!理论实战齐飞

做梦都在改BUG

Java 架构 微服务 Spring Cloud

3天速成!阿里人私用的Netty速成实战手册,3天Github星标11.5k

Java你猿哥

Java 源码 Netty ssm netty内存管理

Flutter三棵树系列之详解各种Key | 京东云技术团队

京东科技开发者

flutter key 企业号 5 月 PK 榜 localkey

企业研发效能度量利器,华为云发布CodeArts Board看板服务

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码

做梦都在改BUG

Java 并发编程 多线程 jdk源码

红旗软件正式发布龙蜥社区版国产高可靠操作系统

OpenAnolis小助手

Linux 开源 龙蜥社区 红旗软件 社区版操作系统

常用的表格检测识别方法——表格结构识别方法(上)

合合技术团队

人工智能 深度学习 算法 人工智能文字识别 表格检测

通过OpenGL理解前端渲染原理(1)_文化 & 方法_崔晓迪_InfoQ精选文章