(1)Opengl ES 基础概念

Opengl ES基础系列文章是音视频学习的图形图像部分,旨在通过这部分学习,能够把Opengl ES和视频结合在一起,最终形成一个完整的知识体系。

这一节我们介绍Opengl ES的几个基本东西,为后面的学习有个整体的概念,而且只做最简单的概
念介绍,不会长篇大论(对于初学者会搞得晕头转向),大家也不必要去追根究底,只要记住有这么个
东西就行,通过后面的学习,然后再回过头来看,一定会有顿悟的感觉。这节主要介绍如下几个知识点。

  • Opengl ES渲染管线
  • 可编程着色器
  • 着色器语言GLSL介绍
  • Opengl ES坐标

    1. 管线
       简单理解就是显卡绘制的流水线,主要阶段如下(下面这张图来自于网络,如有侵权,请告知):

?

从上图可以看出,顶点着色器描述绘制的形状,然后进行片元的装配、裁剪、光栅化,到片元着色,最后输出到帧缓冲区,到帧缓冲区,渲染的数据准备好了,下一步提交到屏幕显示。

    2. 可编程着色器
       从管线的流程我们知道,其中的顶点着色器和片元着色器这两个流程是可以编程定制的。

  • 顶点着色器

通过编程确定我们绘制的区域,片元(姑且叫绘制区域)就是通过描述的顶点来计算生成的。

  • 片元着色器

为我们绘制的区域进行颜色或图像填充(描述不太专业但是好理解)。

上面简单介绍顶点着色器和片元着色器,下一节会详细介绍,包括写法、编译和链接等。

    3. 着色器语言GLSL
       既然着色器可以编程定制,那么就需要对应的编写语言来完成,这就是GLSL,它是Opengl ES里
用来编写顶点着色器和片元着色器的语言,类似C语言,有变量、函数定义,执行方法是main,下面主
要介绍下GLSL用到的类型和几个常用修饰符的含义。

3.1 GLSL数据类型

float  bool  int    基本数据类型

vec2                包含了2个浮点数的向量

vec3                包含了3个浮点数的向量

vec4                包含了4个浮点数的向量

ivec2               包含了2个整数的向量

ivec3               包含了3个整数的向量

ivec4               包含了4个整数的向量

bvec2               包含了2个布尔数的向量

bvec3               包含了3个布尔数的向量

bvec4               包含了4个布尔数的向量

mat2                2*2维矩阵

mat3                3*3维矩阵

mat4                4*4维矩阵

sampler1D           1D纹理采样器

sampler2D           2D纹理采样器

sampler3D           3D纹理采样器

  3.2 变量修饰符

  • attribute

由 vertext array 提供的顶点数据,如空间位置,法向量,纹理坐标以及顶点颜色,属性可以理解为针对每一个顶点的输入数据。属性只在顶点着色器中才有,片元着色器中没有属性。OpenGL ES 2.0 规定了所有实现应该支持的最大属性个数不能少于 8 个。

  • uniform

Uniforms保存由应用程序传递给着色器的只读常量数据。在顶点着色器中,这些数据通常是变换矩阵,光照参数,颜色等。由 uniform 修饰符修饰的变量属于全局变量,该全局性对顶点着色器与片元着色器均可见,也就是说,这两个着色器如果被连接到同一个应用程序中,它们共享同一份 uniform 全局变量集。因此如果在这两个着色器中都声明了同名的 uniform 变量,要保证这对同名变量完全相同:同名+同类型,因为它们实际是同一个变量。此外,uniform 变量存储在常量存储区,因此限制了uniform 变量的个数,OpenGL ES 2.0 也规定了所有实现应该支持的最大顶点着色器 uniform 变量个数不能少于 128 个,最大的片元着色器 uniform 变量个数不能少于 16 个。

  • varying

varying 变量用于存储顶点着色器的输出数据,也存储片元着色器的输入数据。varying 变量会在光栅化处理阶段被线性插值。顶点着色器如果声明了 varying 变量,它必须被传递到片元着色器中才能进一步传递到下一阶段,因此顶点着色器中声明的 varying 变量都应在片元着色器中重新声明为同名同类型的 varying 变量。OpenGL ES 2.0 也规定了所有实现应该支持的最大varying 变量个数不能少于8 个。

  • Samplers

一种特殊的 uniform,用于呈现纹理。sampler 可用于顶点着色器和片元着色器。

  • const

常量的定义,其和uniform区别是,uniform是全局,外部可以初始化,着色器里不可更改;而const仅仅在着色器里定义的常量而已。

4. Opengl ES坐标
       Opengl ES坐标及其转换,网上有很多介绍,但大都是概念性的,对于初学者会看的云里雾里的
,这里我们一步一步来,先介绍顶点坐标和纹理坐标。

  • 归一化

首先,Opengl ES里坐标范围在[-1, 1]范围,这个叫归一化坐标,通过比率和屏幕坐标进行映
射,通俗点讲,通过归一化坐标不会发生越界访问操作。

  • 顶点坐标

这是Opengl ES里的坐标系,就是网上很多文章说的世界坐标,它是以中心点为原点,大小在[-1, 1]范围内的点组成。

?

从上图看出,Opengl ES的坐标原点在中心,坐标都归一化到[-1, 1],定点坐标到屏幕的显示会经过一系列的变化,然后结合视窗(实际显示的屏幕视口坐标)最终渲染图形或图像到屏幕。

关于视窗坐标后面我们会结合实际的项目进行理解。

  • 纹理坐标

这个坐标先理解为贴图到顶点坐标的映射关系的描述,纹理坐标以左下点为原点,向上为Y正轴,向右为X的正轴,也叫做S、T向量。

?

纹理坐标被归一化到[0, 1]范围,比如800x600(宽x高)的一副图像,如果纹理坐标为(0,0)、(0.0.5)、(0.5,0.5)、(0.5,0),那么实际渲染的图像区域是从左下角开始往上300像素,往右400像素的区域。

为了避免复杂性,这里我们没有介绍Z轴,后面讲到3D以及坐标转换的时候会介绍,学习需要循序渐进、由易到难,这样才会事半功倍。

上面的介绍足够简单,大家只需要知道有这么个东西即可,下一节我们继续介绍顶点着色器和片元着色器,因为这在Opengl ES2.0是我们绘图用到的,从第三节开始,我们就会以实际项目逐步介绍,因此,这两节大家可以快速浏览,记住概念即可。

为了让初学者理解,很多概念用形象的语言来描述,如有讲解不当之处,欢迎大家指正,谢谢!

本系列文章均为原创,主要总结作者多年在软件行业的一些经验,和大家共同学习、进步,转载请注明出处,谢谢!

原文地址:https://www.cnblogs.com/xiaomazixun/p/10269986.html

时间: 2024-10-06 01:37:04

(1)Opengl ES 基础概念的相关文章

OpenGL ES(一.概念)

OpenGL ES是以手持和嵌入式设备为目标的高级3D图形应用程序编程接口,主要的支持平台是iOS,Android,Linux和Windows 1.顶点着色器 他可以用于通过矩阵变换位置,计算照明公式来生成逐顶点颜色以及生成或者变换纹理坐标等基于顶点的传统操作顶点着色器的输入包括:1.着色器程序--描述顶点上执行操作的顶点着色器程序源代码或者可执行文件2.顶点着色器输入(或者属性)--用顶点数组提供的每个顶点的数据3.统一变量(uniform)--顶点(或者片段)着色器使用的不变数据4.采样器-

03: OpenGL ES 基础教程02 使用OpenGL ES 基本步骤

第二章:让硬件为你工作(OpenGL ES 应用实践指南 iOS卷) 前言: 1:使用OpenGL ES 基本步骤 2:绘制三角形 3:效果 正文: 一:使用OpenGL ES 基本步骤 1:生成缓存标识符 glGenBuffers(); 2:绑定缓存标识符到当前缓存区域   glBindBuffer(); 3:初始化且分配缓存内存(通常是从CPU控制的内存复制数据到分配的内存)  glBufferData( ); 4:  启用缓存中的数据 glEnableVertexAttribArray()

[ES] 基础概念

Elasticsearch是基于Luence实现的一款搜索引擎,支持分布式和集群,并且搜索近实时,主要用于搜索和数据分析 索引 index 可以理解为数据库中的database,存储的是实际数据,因为ES是以Luence为基础的,Luence索引是一种倒排索引结构,不同于数据库中的表面向行数据,索引是面向词而非面向文档,如下图是一个简单的存储结构: 一个索引由多个段组成,段的特性:写一次读多次,删除段中的文档本质并不能立即被删除,只有段合并的时候,Luence才会决定将其删除 索引命名必须是小写

OpenGL®ES基础

参考:http://www.cnblogs.com/salam/archive/2016/01/08/5113572.html http://blog.csdn.net/wangyuchun_799/article/details/7736928

es 基础概念总结 —— Request Body Search

一.query DSL 叶子查询 于特定字段查询特定值.如 match, term 或 range 查询 复合查询 包装其它叶子查询或复合查询.如使用 bool or dis_max 混合多个查询 分离最大化查询 dis_max 分离最大化查询(Disjunction Max Query)指的是: 将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回,而不是将所有匹配结果的得分相加. 示例: { "query": { "dis_max"

在Android中使用OpenGL ES进行开发第(一)节:概念先行

一.前期基础是知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGL ES绘制2D/3D图形的第一步:定义图形:——运用部分 ③使用OpenGL ES绘制出②步骤中定义好的图形:——运用部分,难点所在 通过这三篇文章的分析,就像给万丈高楼垫定了基石,万丈高楼平地起,后面利用OpenGLES做各种效果,各种变换都是建立在这三步的图形编程理解之上的. 话不多说正文开始 (1)什么

(2)Opengl ES 着色器介绍

Opengl ES基础系列文章是音视频学习的图形图像部分,旨在通过这部分学习,能够把Opengl ES和视频结合在一起,最终形成一个完整的知识体系. 着色器的写法类似C语言,可以定义变量.常量以及函数,有main方法,在Opengl ES渲染过程中,会不断调用其main方法来进行计算,我们不去大篇幅讨论着色器语法.API等,会通过实际的例子让大家真正知道着色器中变量的含义.以及对变量进行定位和其赋值等. 1. 术语 VertexShader:顶点着色器: FragmentShader:片段着色器

从零开始学习OpenGL ES之一 – 基本概念

我曾写过一些文章介绍iPhone OpenGL ES编程,但大部分针对的是已经至少懂得一些3D编程知识的人.作为起点,请下载我的OpenGL Xcode项目模板,而不要使用Apple提供的模板.你可以解压到下面位置安装此模板:/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application/ 已经有大量有关OpenGL的好教程和书籍.但是,却没有多少是关于OpenGL ES,而

Android OpenGL ES零基础系列(三):OpenGL ES的渲染管道及VertexShader与FragmentShader

前言 在前2篇文章中,我们都说到着色器,且在第二篇中正式说到,这着色器只能用在OpenGL ES2.x等可编程管道里面,而在OpenGL ES1.x是不能用的.但我们一直没有说这是为什么,两者有什么区别.那这篇我们就一起来学习下OpenGL ES中的渲染管道. 正文 管道,英文名叫Pipeline,相信用过FaceBook图片加载库的同学对这个管道并不陌生,因为SimpleImageDrawee里面也是用的管道来对图片进行的一个处理.由于其底层也是C,因此我可以大胆的猜想,FaceBook图片加