OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

原创 2017年01月03日 14:32:28

             


有几个学习图形学不久的同学都问到这个问题,做一阐述:

1.关键字的小修改大概由如下两点决定

     第一,先考虑一个成本原则

一个关键字的定义是否修改,是由熟练程序员在使用该关键字时的思维成本来决定的。

当然,还有一个原则,是由初学者的学习成本来决定的,这时一条市场原则(微软喜欢这个原则)。

attribute改成in,varying 改成out,恰巧符合上面两条原则。

初学shading language的同学,意识不到uniform和attribute的却别,不能第一时间知道uniform是全体顶点都使用的同一个变量,而attribute是每一顶点各自的变量。需要经过长期的应用感受才知道其差别;

而且,每次使用的时候,都要在思维上承受这个比较绕的思维过程,一定程度上使得程序员不能很好地专注于应用问题的解决。当然了,经过长期的使用肯定会克服,但是成本太高。故,改成in和out在学习时和使用时,在思维上就自然了。



     第二,这种改变是因为桌面OGL GLSL的改变引起的

OpenGL ES的Spec的形成原则:

很绕,总体原则如下三点:

1.   嵌入式版本的  OGL ES由OGL ES API  和 OGL ES SL构成,二者有自己独立的版本号,经常是不一样的。

如,ES2.0中的版本号2.0是强调API的版本号为2.0,而这一版的SL版本是ES SL1.10.  

2.   桌面版本的  OpenGL 由OpenGL API和 GLSL构成,二者有自己独立的版本号,经常是不一样的。

如,OGL2.0中的2.0是强调API的版本号为2.0,而这一版的GLSL是第一次出现在OGL中,版本号为GLSL1.10

3.   嵌入式OGL ES来源于某个版本的桌面OGL。

4.   OGL ES1.0来源于桌面OGL1.3和OGL ES 1.1来源于桌面OGL1.5,它们都是固定管线,我们略过。ES 2.0开始,是可编程的管线。



2.OGL ES的版本来源


下面这两段彩色文字,可以只看粗体部分,简单说:

ES2.0 API来源于 桌面OGL2.0 ;  ES2.0  SL1.10.17  来源于  GLSL1.20      .

由:https://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf    的

The OpenGL ES Shading Language (also known as GLSL ES or ESSL) is based on theOpenGL Shading Language (GLSL) version 1.20.


ES3.0 API来源于 桌面OGL3.3 ;   ES2.0  SL3.00.6  来源于  GLSL3.30.7    .   但是,OGL3.3的GLSL版本号是GLSL 3.30.6  ,修正号不同。

由:https://www.khronos.org/registry/gles/specs/3.0/GLSL_ES_Specification_3.00.pdf  的

1.1 Changes 

This specification is derived fromOpenGL GLSL 3.3 revision 7



GLSL1.20中,顶点属性,输入时使用的是attribute,输出时使用的是varying;

GLSL3.30中,顶点属性对应使用的是in和out


总之:OGL ES API都会自于某个版本的OGL API spec,并且ES SL会来源于与OGL API版本较近的GLSL spec,


3.OGL、OGL ES、DirectX的版本发布时间



另外一个很重要的事情:OGL比DX出现的早,而且通用。可参考OGL各个版本的spec的发布日期。

1992.1月     OpenGL 1.0  发布;

 

1995年   DirectX 1.0  发布,并且不太成功;


1997.1月OGL1.1发布,

1997年  DirectX 3.0 发布;


1998.3.16   OGL1.2发布;

1998.10      OGL1.2.1发布;


2001.8.14  OGL1.3发布;


2002年  Direct9.0发布,并不断修改,现在依然主流,后面几年有   DX9.0b  和   DX9.0c  发布;

2002年   OpenGL ES 1.0 公布,固定管线。

2002.7.24  OGL1.4 发布;


2003.7.29  OGL1.5发布;


2004.9.7  OGL 2.0   和  GLSL1.0   发布;  OGL中开始出现shader语言,并在后面几年不断提高,出现了GLSL1.1  和GLSL1.2( glsl1.2是  ES2.0 SL的母版本 )


2005年   OpenGL ES 1.10 公布,固定管线。


2006.7.2   OGL2.1  发布 ,伴随GLSL1.20.8


2008.8.11  OGL3.0发布,伴随GLSL1.30.10,  其中的attribute   varying等就已经改成了  in和out;

这段时间前后有DX10  和DX10.1发布,但不太流行;


2009年   OpenGL ES 2.0 公布,在OpenGL 2.0 和GLSL1.20基础上提炼而来。

2009.1  DX11 发布,加入了细分着色器

2009.3.24  OGL3.1  发布,  伴随GLSL1.40.08  ;

2009.8.3  OGL3.2 发布,    伴随GLSL1.50.11  ,并且加入了几何着色器,出现三种shader


2010.3.11  OGL3.3发布;同时  OGL4.0发布,伴随GLSL4.00.9   并且加入了细分着色器(ATI在2001年就首先设计出来了),出现四种shader(此后将OGLAPI版本号与GLSL版本号统一起来了)

2010.7.26  OGL4.1 发布,伴随GLSL4.10.6


2011.8.8 OGL4.2发布,伴随GLSL4.20.11

2011.10  DX11.1  发布;


2012   OpenGL ES 3.0 公布,在OpenGL 3.x 和 4.x的基础上增加了许多新的功能。

2012.8.6  OGL4.3发布,伴随GLSL4.30.8


2013.6    DX11.2  发布;

2013.7.23  OGL4.4发布,伴随GLSL4.40.9 



2014.3   DX12发布;  这个把本增加了并行计算功能,应该会比较流行。


2016  OGL4.5  ,随GLSL4.50  ;

2016   OpenGL ES 3.1和3.2 公布,并且加入了细分着色器和几何着色器。 不要有侥幸心理了,未来的Andorid和iOS都会有这样的着色器编程,哈哈,学起来吧。知识量越多的一个图形库,掌握难度越大,功能也越强,开发的产品也就越人性化。



学任何学科其实都是在学习它的历史。


GLSL vary、atrribute、in、out的区别

这个问题困扰我很久了,前一段时间面试,面试官问我GLSL中的vary、atrribute,当时我就懵逼了,一阵心虚,我只说我知道in out,应为我学的就只有in out,回来自己也查了查,GLSL中...
  • shenshen211
  • shenshen211
  • 2016年07月01日 16:45
  • 3740

【OpenGL】GLSL中的函数和子程序(subroutines)

这篇文章里讲一下在GLSL如何使用函数和子程序(subroutines)。 在GLSL中使用函数 GLSL支持函数,它们的语法结构和C很相似。但是调用约定会有所不同。下面,我们以一个普通的...
  • candycat1992
  • candycat1992
  • 2013年05月25日 09:55
  • 10053

OpenGL ES着色语言之varying,uniform,attribute修饰范围

varying 修饰符只能用在float, vec2, vec3, vec4, mat2, mat3, mat4和包含这些类型元素的数组上,不能用于修饰结构体。 uniform 修饰...
  • wangyuchun_799
  • wangyuchun_799
  • 2012年07月16日 16:21
  • 3096

OpenGL 与 GLSL 版本

来自:https://github.com/mattdesl/lwjgl-basics/wiki/GLSL-Versions You can use the #version command a...
  • ym19860303
  • ym19860303
  • 2015年03月07日 11:49
  • 5751

OpenGL ES3.0 编程指南 第二版

  • 2014年08月21日 11:36
  • 22.32MB
  • 下载

iOS下OpenGL ES 3.0编程入门(一):构建Hello World环境

OpenGL ES简介:      OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而...
  • sx1989827
  • sx1989827
  • 2015年08月05日 22:52
  • 14259

OpenGL ES 三种类型修饰 uniform attribute varying

1.uniform变量 uniform变量是外部application程序传递给(vertex和fragment)shader的变量。因此它是application通过 函数glUniform...
  • shaojieli
  • shaojieli
  • 2013年11月28日 13:58
  • 474

OpenGL

GLSL语法跟C语言非常相似: 1.数据类型: GLSL包含下面几种简单的数据类型 float  bool :false or ture int 向量: vec   {2,3,4}   ...
  • asfdasfdsf
  • asfdasfdsf
  • 2014年04月07日 22:26
  • 309

OpenGL ES 三种类型修饰 uniform attribute varying

真心想自己写,对这方面确实了解太少,写不出什么东西来,先转一些好点的基础性文章吧。 1.uniform变量 uniform变量是外部application程序传递给(vertex和fragment...
  • goodtalent
  • goodtalent
  • 2016年11月12日 10:02
  • 633

OpenGL ES Shader的三种变量类型uniform,attribute和varying

uniform变量uniform变量是外部application程序传递给(vertex和fragment)shader的变量。因此它是application通过函数glUniform**()函数赋值...
  • lb377463323
  • lb377463323
  • 2017年03月25日 19:06
  • 881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out
举报原因:
原因补充:

(最多只允许输入30个字)