OpenGL ES 2.0 渲染管线

OpenGL ES入门指南(一) 想学OpenGL?想在手机端上实现酷炫效果?那还不快来了解OpenGL ES 阅读详情

OpenGL ES 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:OpenGL ES 2.0 API规范和OpenGL ES着色语言规范。下图是OpenGL ES 2.0渲染管线,阴影部分是OpenGL ES 2.0的可编程阶段。



1. 顶点着色器(Vertex Shader)
顶点着色器对顶点实现了一种通用的可编程方法。
顶点着色器的输入数据由下面组成:
Attributes:使用顶点数组封装每个顶点的数据,一般用于每个顶点都各不相同的变量,如顶点位置、颜色等。
Uniforms:顶点着色器使用的常量数据,不能被着色器修改,一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的变量,如当前光源的位置。
Samplers:这个是可选的,一种特殊的uniforms,表示顶点着色器使用的纹理。
Vertex Shader:顶点着色器的源码或可执行文件,描述了将对顶点执行的操作。
顶点着色器的输出数据是varying变量,在图元光栅化阶段,这些varying值为每个生成的片元进行计算,并将结果作为片元着色器的输入数据。从分配给每个顶点的原始varying值来为每个片元生成一个varying值的机制叫做插值。
顶点着色器数据的输入和输出可以参考下图:


顶点着色器可用于传统的基于顶点的操作,例如:基于矩阵变换位置,进行光照计算来生成每个顶点的颜色,生成或者变换纹理坐标。
另外因为顶点着色器是由应用程序指定的,所以你可以用来进行任意自定义的顶点变换。

下面是一个用OpenGL ES着色器语言编写的顶点着色器源码,这个顶点着色器使用一个position和跟它相关联的color数据作为输入数据,通过一个4×4矩阵变换位置,然后输出变换后的位置和颜色数据。

// uniforms used by the vertex shader
uniform mat4 u_mvpMatrix; 

// attributes input to the vertex shader
attribute vec4 a_position; 
attribute vec4 a_color; 

// varying variables – input to the fragment shader
varying vec4 v_color; 
void main()
{
	v_color = a_color;
	gl_Position = u_mvpMatrix * a_position;
}

第2行代码定义了一个uniform变量u_mvpMatrix,mat4表示4×4浮点数矩阵,该变量存储了组合模型视图和投影矩阵。6和7行代码定义了顶点着色器的输入数据:Attributes,vec4表示包含了4个浮点数的向量,a_position是顶点位置属性,a_color是顶点颜色属性。第10行代码定义了varying类型的变量v_color,varying是用于从顶点着色器传递到片元着色器的变量,v_color是顶点着色器的输出数据,存储了每个顶点的颜色。第10行的main函数是顶点着色器的入口,第12行读取了顶点着色器输入属性中a_color的值,并把它赋值给输出数据v_color,第13行的gl_Position 是内置的varying变量,不需要声明,顶点着色器必须把变换后的位置赋值给它。

2.图元装配(Primitive Assembly)
顶点着色器之后,渲染流水线的下一个阶段是图元装配,图元是一个能用OpenGL ES绘图命令绘制的几何体,绘图命令指定了一组顶点属性,描述了图元的几何形状和图元类型。顶点着色器使用这些顶点属性计算顶点的位置、颜色以及纹理坐标,这样才能传到片元着色器。在图元装配阶段,这些着色器处理过的顶点被组装到一个个独立的几何图元中,例如三角形、线、点精灵。对于每个图元,必须确定它是否位于视椎体内(3维空间显示在屏幕上的可见区域),如果图元部分在视椎体中,需要进行裁剪,如果图元全部在视椎体外,则直接丢弃图元。裁剪之后,顶点位置转换成了屏幕坐标。背面剔除操作也会执行,它根据图元是正面还是背面,如果是背面则丢弃该图元。经过裁剪和背面剔除操作后,就进入渲染流水线的下一个阶段:光栅化。

3. 光栅化(Rasterization)
光栅化阶段把图元转换成片元集合,之后会提交给片元着色器处理,这些片元集合表示可以被绘制到屏幕的像素。如下图所示:


4. 片元着色器(Fragment Shader)
片元着色器对片元实现了一种通用的可编程方法,它对光栅化阶段产生的每个片元进行操作,需要的输入数据如下:
Varying variables:顶点着色器输出的varying变量经过光栅化插值计算后产生的作用于每个片元的值。
Uniforms:片元着色器使用的常量数据
Samplers:一种特殊的uniforms,表示片元着色器使用的纹理。
Fragment Shader:片元着色器的源码或可执行文件,描述了将对片元执行的操作。
片元着色器也可以丢弃片元或者为片元生成一个颜色值,保存到内置变量gl_FragColor。光栅化阶段产生的颜色、深度、模板和屏幕坐标(Xw, Yw)成为流水线中per-fragment阶段( FragmentShader之后)的输入。如下图:


下面是一个简单的片元着色器源码,可以跟上面的顶点着色器源码结合绘制一个高洛德着色的三角形。

precision mediump float;

varying vec4 v_color; 

void main(void)
{
	gl_FragColor = v_color;
}

第1行代码设置默认的精度修饰符,有highp、mediump、lowp,这个后面再详细解释。第3行代码定义了片元着色器的输入数据,顶点着色器必须赋值给片元着色器一组一样的varying变量。注意:gl_FragColor是片元着色器唯一的输出,第7行代码把输入数据v_color赋值给gl_FragColor。

5. 逐个片元操作阶段(Per-Fragment Operations)
片元着色器之后就是逐个片元操作阶段,包括一系列的测试阶段。一个光栅化阶段产生的具有屏幕坐标(Xw, Yw)的片元,只能修改framebuffer(帧缓冲)中位置在(Xw, Yw)的像素。下图是OpenGL ES 2.0逐片元操作的过程:



Pixel Ownership Test:像素所有权测试决定framebuffer中某一个(Xw, Yw)位置的像素是否属于当前OpenGL ES的context,比如:如果一个OpenGL ES帧缓冲窗口被其他窗口遮住了,窗口系统将决定被遮住的像素不属于当前OpenGL ES的context,因此也就不会被显示。
Scissor Test:裁剪测试决定位置为(Xw, Yw)的片元是否位于裁剪矩形内,如果不在,则被丢弃。
Stencil Test and Depth Test:模板和深度测试传入片元的模板和深度值,决定是否丢弃片元。
Blending:将新产生的片元颜色值和framebuffer中某个(Xw, Yw)位置存储的颜色值进行混合。
Dithering:抖动可以用来最大限度的减少使用有限精度存储颜色值到framebuffer的工件。
逐片元操作之后,片元要么被丢弃,要么一个片元的颜色,深度或者模板值被写入到framebuffer的(Xw, Yw)位置,不过是否真的会写入还得依赖于write masks启用与否。write masks能更好的控制颜色、深度和模板值写入到合适的缓冲区。例如:颜色缓冲区中的write mask可以被设置成没有红色值写入到颜色缓冲区。另外,OpenGL ES 2.0提供从framebuffer中获取像素的接口,不过需要记住的是像素只能从颜色缓冲区读回,深度和模板值不能读回。

注意:OpenGL ES 2.0 的Per-Fragment Operations已经不再支持Alpha test 和 LogicOp了,这两个步骤在 OpenGL 2.0 和 OpenGL ES 1.x中是存在的。Alpha test 阶段不再需要的原因是片元着色器可以丢弃片元,所以可以在片元着色器中执行Alpha test。 LogicOp因为很少使用,所以不再支持了。



转载请注明来自:Alex Zhou的程序世界,本文链接:http://codingnow.cn/opengles/1504.html

第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 GL_TRIANGLE_STRIP:指定要绘制的基本图元类型为三角形条带,即每三个顶点定义一个三角形,但从第三个顶点开始,每个新顶点都与前两个顶点一起构成一个新的三角形。坐标系 的 左下点(-1, -1),右下角(1,-1) , 左上角(-1, 1) , 右上角(1 , 1)坐标系 的 左下点 (00),右下角(1 , 0) , 左上角(0, 1 ), 右上角(1, 1)0:指定了要渲染的顶点数组的起始索引,这里表示从顶点数组的第一个顶点开始。使用第二个顶点作为三角形条带的第二个顶点。 阅读详情

相关推荐

surfer10与Arcgis10.3 完美生成等值线和等值面方法

surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.713333 214 116.73349 40.798607 566 2.在surfer中,选择Gr

哈里·雪利博客 1万+

一文快速入门OpenGLES:现代移动GPU编程的第一步

OpenGL ESOpenGL for Embedded Systems) 是一种免费的跨平台3D图形 API接口,其适用于低功耗设备,可用于嵌入式设备和移动设备(包括手机、车载大屏 和嵌入式电器终端设备)上渲染高效的 2D 、 3D 图形。 其由OpenGL(Open Graphics Library)针对嵌入式设备裁剪而来,去除了OpenGL中许多不是必须冗余特性,比如:GL_QUADS(四边形)、GL_POLYGONS(多边形)绘制模式、glBegin(开始)/glEnd(结束)等特性。 OpenG

bjxiaxueliang的CODING小栈 3868

血管分割中的直径平衡难题:从clDice到cbDice的演进与实践

本文探讨了血管分割中的直径平衡难题,详细分析了从clDice到cbDice的技术演进与实践。通过引入半径感知权重和边界对齐惩罚,cbDice在保持拓扑完整性的同时提升了几何敏感度,显著改善了细小血管的分割效果。文章还分享了在nnU-Net中实现cbDice的工程细节,包括GPU加速骨架提取和多任务损失组合策略,为医学影像分析提供了重要参考。

weixin_29170327的博客 208

OpenGL ES入门介绍

OpenGL(Open Graphics Library)是一个跨平台图像程序接口,用于二维和三位图片的渲染。OpenGL ES(Open Graphic Library Embedded Systems)是OpenGL的一个子集,用于手机和嵌入式设备在android中对OpenGL ES的支持如下1. OpenGL ES 2.0 支持android2.2以后的版本2. OpenGL ES 3.0 支持android4.3以后的版本。

WolfKingzyh的博客 1765

OpenGL ES 入门指南:从基础到实战

在当今的嵌入式设备(如智能手机、汽车仪表盘、智能家居中控屏)中,流畅的图形渲染能力是用户体验的核心。OpenGL ES 2.0 可编程渲染管线(图片来源:LearnOpenGL),手把手教你如何从零搭建开发环境、编写代码,并优化嵌入式设备的图形性能。本文将深入解析 OpenGL ES 的核心概念,并通过一个完整的。✅ 嵌入式 Linux 开发环境搭建(Yocto 集成)以 NXP i.MX 8M Plus 为例,配置。✅ OpenGL ES 核心概念与版本差异。动手实践,让你的嵌入式设备焕发图形魅力!

Interview_TC的博客 4014

OpenGL学习(二)OpenGL ES 2.0渲染管线流程

OpenGL ES 2.0 渲染管线流程 整个渲染流程如下图: 客户端程序通过调用OpenGL接口,将顶点、着色器程序、纹理以及其他GL参数状态传入OPpenGL服务器端;当客户端调用渲染命令时,OpenGL对输入的图元逐一执行渲染管线的每个阶段;把每个像素的颜色写入帧缓冲中。最后,视窗系统通过帧缓冲的颜色显示在屏幕上。 下面逐一介绍每个阶段: 顶点数组 绘制时,会把每个图形转换为一组图元;每...

qq_37778064的博客 584

OpenGL ES渲染管线】一:2.0 OpenGL ES渲染管线流程图

原文:【OpenGL ES渲染管线】一:2.0 OpenGL ES渲染管线流程图 学习OpenGL最重要就是学会这学会套渲染管线的流程了,ES作为其子集,继承了OpenGL的绝大部分特性,这里以OpenGL ES管线进行介绍 网上各种学习博客文章数不胜数,但是总感觉对于初学者来说很难将其串起来,对渲染的流程没有整体的了解。 应该说是没有一个完整的流程图,每个部分的讲解都很清晰,但是,初...

343

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0可编程阶段。   1. 顶点着色器(V

借你一秒 1777

【面试必读(编程基础)】OpenGL ES 2.0渲染管线

https://blog.csdn.net/chrisfxs/article/details/53291604 http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0可编程阶段。 1. 顶点着色器...

u010029439的博客 529

OpenGL ES 2.0渲染管线

OpenGL ES 2.0渲染管线管线(pipeline)也称渲染管线OpenGL ES在渲染处理过程中会顺序执行一系列操作,这一系列相关的处理阶段就被称为OpenGL ES 渲染管线OpenGL ES 1.x 固定管线OpenGL ES 2.0 可编程管线。1、顶点着色器(VertexShader) 顶点着色器对顶点实现了一种通用的可编程方法。 输入数据: Attributes

keen_zuxwang的博客 704

OpenGL ES 2.0打造iPad 3D渲染引擎:Revolved渲染管线完整拆解

Revolved 是一款 iPad 3D 建模应用,基于 OpenGL ES 2.0 实现了完整的 3D 渲染引擎:在右侧画布手绘 2D 轮廓,左侧立刻看到旋转生成的 3D 模型。本文完整拆解它的渲染管线——离屏多采样 Framebuffer、GPU 实例化绘制、双 Viewport 调度,五个层次逐一拆开看。 ## Revolved渲染架构总览:五层协作的3D引擎 [![Revolved i

gitblog_01134的博客 805

OpenGL ES 2.0 渲染管线 学习笔记

图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader可编程管线; Vertex Array/Buffer objects 顶点数据来源,这时渲染管线的顶点输入,通常使用 Buffer objects效率更好。 Vertex Shader 顶点着色器通过矩阵变换位置、计算照明公式来生成逐顶点颜色已经生成或变...

242

【C++ OpenGL ES 2.0编程笔记】1: OpenGL ES 2.0 渲染管线和EGL

本文介绍了OpenGL ES 2.0渲染管线:graphic pipeline和作为OpenGL API和本地窗口之间接口的EGL.

Small Flows 3144

对用OpenGL ES 2.0实现OpenGL ES 1.1的顶点着色器的研究

想要彻底研究OpenGL ES 2.0于前一代OpenGL的区别,还是要费很大一番精力的。最近在仔细研读《OpenGL ES 2.0 Programming Guide》,虽然这本书最早出版日期是2008年,距今已经7年了,而著作的日期或许还要早上半年到1年,但是目前OpenGL ES 2.0是主流三维开发框架,因此这本书的知识直到现在,依然受用。

开发游戏,辉煌全中国 2642

基于YOLO的训练脚本.zip

基于YOLO的训练脚本.zip

上一篇: 浅析GCC下C++类对象的内存布局
ZinanJau
博客等级 码龄18年 71粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值