硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

通过 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:232328

评论

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

谷歌云对象存储攻防

火线安全

云原生 云安全 云存储

云原生安全实践

火线安全

云原生 安全 云安全

云计算时代,好用的IT运维软件我给推荐行云管家!

行云管家

云计算 运维 网络运维 IT运维

《OceanBase 数据库系统概念》首次发布,系统精准定义 OceanBase !

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版

【Zeekr_Tech】软件定义汽车之SOME/IP介绍

Zeekr_Tech

中间件 软件架构

TypeScript里string和String,真不是仅仅是大小写的区别

华为云开发者联盟

JavaScript typescript string ts

EventBridge 事件总线及 EDA 架构解析

阿里巴巴云原生

NextArch基金会微服务技术组成立,腾讯为创始单位之一

科技热闻

性能指标、响应时间、并发量…聊聊性能优化的衡量指标

华为云开发者联盟

性能优化 高并发 响应时间 性能指标 并发量

ABAP 常用日期处理

Jasen Ye

Date 日期处理 abap

尚硅谷监控告警系统(Zabbix)视频教程发布

@零度

大数据 zabbix

java培训SpringBoot性能优化

@零度

Java springboot

使用vite创建vue3项目

隔壁的猫

前端 Vite2 vue3.2 3月月更

产品经理必看的高效产品文档撰写指南

小炮

产品文档

4种典型限流实践保障应用高可用|云效工程师指北

阿里云云效

云计算 阿里云 云原生 系统安全 研发

浅谈SaaS多租户数据隔离和共享

数商云

SASS

DevSecOps邂逅云原生:云原生时代下的持续安全

火线安全

DevOps 云原生 云安全 云原生安全

DevSecOps: 让大家都 Happy 的安全软件构建模式

火线安全

云原生 软件架构 DevSecOps 云安全

碰到运维难题怎么快速解决?有工具推荐吗?

行云管家

运维 网络运维 IT运维 服务器运维

web前端培训JS解构赋值知识点分享

@零度

JavaScript web前端

Flink 在米哈游的落地实践

Apache Flink

大数据 flink 编程 流计算 实时计算

数字经济“双碳”目标下,“东数西算”数据中心为何依靠液冷散热技术节能减排?

GPU算力

东数西算 GPU服务器

贝壳Flutter UI 自动化测试原理与实践 - 已开源

贝壳大前端技术团队

flutter 测试 UI自动化 贝壳找房

OpenHarmony 标准系统 HDF 框架之 I2C 驱动开发

Anna

开源 后端 直播 OpenHarmony I2C

负载均衡,你想了解的全在这里!

博文视点Broadview

关于 Nvm

隔壁的猫

node.js 前端 NVM 3月月更

关于React项目本地开发设置Https的过程

隔壁的猫

前端 React 3月月更

有奖互动|中国信通院联合 OceanBase 邀您参加《数据库发展研究报告(2022)》调研问卷

OceanBase 数据库

大数据培训Flink中常见问题定位

@零度

大数据 flink

平衡树:为什么Redis内部实现用跳跃表

华为云开发者联盟

redis 数据结构 集合 跳跃表 平衡树

数盾科技加入,携手龙蜥社区提升网络安全整体防护能力

OpenAnolis小助手

开源 网络安全 数盾科技 密码算法

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