第八章 顶点着色器

顶点着色器是对顶点,计算光照以及纹理坐标等相关的操作,第6章,“顶点属性、顶点数组和缓冲对象”,讨论了如何指定顶点属性和统一输入,并对OpenGL ES 2.0着色语言进行了很好的描述。在第7章“图元组装和光栅化”中,我们讨论了光栅化阶段如何使用顶点着色器的输出来生成每个片段的值,然后将这些值输入到片段着色器。这里,从顶点着色器的高级概述开始,包括它的输入和输出。然后,我们讨论OpenGL ES 2.0,然后我们通过讨论几个例子来描述如何编写顶点着色器。这些示例描述了一些常见的用例,

  • 例如用模型视图和投影矩阵转换顶点位置
  • 生成逐顶点漫反射和镜面反射颜色的顶点照明示例
  • 纹理坐标生成和顶点蒙皮。

顶点着色器

顶点着色器提供了一种对顶点进行操作的通用可编程方法。顶点着色器的输入包括以下内容:

  • 属性—使用顶点数组提供的每个顶点的数据。
  • 统一-顶点着色器使用的恒定数据。
  • 着色器程序-顶点着色器程序源代码或可执行文件,描述将在顶点上执行的操作。(我目前使用的范围内不常用)

顶点着色器的输出称为可变变量。在图元光栅化阶段,为每个生成的片段计算这些变量的插值,并将其作为输入传递给片段着色器。

内置变量

顶点着色器的内置变量可以分为由顶点着色器输出的特殊变量统一状态(如深度范围)和指定最大值(如属性数量、变量数量和统一数量)的常数。

首先特殊变量

  • GL _POSITION-位置用于输出片段坐标中的顶点位置。gl_Position值由裁剪和视口阶段用来执行图元的适当裁剪,并将顶点位置从裁剪坐标转换为屏幕坐标。
  • gl_PointSize—gl_PointSize用于以像素为单位写入点精灵的大小。渲染点精灵时使用gl_PointSize。然后,顶点着色器输出的gl_PointSize值被箝位到OpenGL ES 2.0实现支持的混叠点大小范围内。gl_PointSize是使用mediump精度限定符声明的浮点变量。
  • 这个特殊的变量,虽然不是由顶点着色器直接编写的,但是是基于顶点着色器生成的位置值和渲染的图元类型生成的。gl_FrontFacing是一个布尔变量。

内置统一状态

顶点着色器中唯一可用的内置统一状态是窗口坐标中的深度范围。这是由内置的统一名称gl _ DepthRange给出的,它被声明为gl _ DepthRangeParameters类型的统一。

struct gl_DepthRangeParameters {
   highp float near; // near Z
   highp float far;  // far Z
   highp float diff; // far - near
}
uniform gl_DepthRangeParameters gl_DepthRange;

内置常量

顶点着色器中还有以下内置常量

const medump int GL _ maxvertices = 8;
const medump int GL _ maxverticalxuriormvector = 128;
const mid UMP int GL _ maxvarying vectors = 8;
const medump int GL _ maxverticaltextureimageunits = 0;
const average UMP int GL _ maxcombinationed texture units = 8;

内置常数描述了以下最大项:

  • 这是可以指定的顶点属性的最大数量。所有ES 2.0实现支持的最小值是8
  • 这是顶点着色器中可以使用的vec4统一条目的最大数量。所有ES 2.0实现支持的最小值是128个vec4条目。开发人员实际可以使用的vec4统一条目的数量因实现和顶点着色器的不同而不同。例如,某些实现可能会根据统一限制对顶点着色器中使用的用户指定的文字值进行计数。在其他情况下,根据顶点着色器是否使用任何内置超越函数,可能需要包含特定于实现的统一(或常量)。目前还没有一种机制可以让应用程序找到在特定顶点着色器中可以使用的统一条目的数量。顶点着色器编译将会失败,并且在编译日志中可能会有提供关于所使用的统一条目数量的特定信息的信息。但是,编译日志返回的信息是特定于实现的。我们在本章中提供了一些指导,以帮助最大限度地利用顶点着色器中可用的顶点统一条目。
  • GL _ MaxVaryingVectors—这是可变向量的最大数量;也就是说,顶点着色器可以输出的vec4条目的数量。所有ES 2.0实现支持的最小值是八个vec4条目。
  • 是顶点着色器中可用的纹理单元的最大数量。最小值为0,这意味着该实现不支持顶点纹理提取。
  • 这是顶点+片段着色器中可用的纹理单元的最大数量的总和。最小值为八。
    为每个内置常量指定的值是所有OpenGL ES 2.0实现必须支持的最小值。实现可能支持大于所述最小值的值。可以使用以下代码查询实际支持的值。

精度限定符

精度限定符可用于指定任何基于浮点或整数的变量的精度。用于指定精度的关键字有低、中、高。此处显示了一些带有精度限定符的声明示例。

highp vec4        position;
varying lowp vec4 color;
mediump float     specularExp;

没有声明变量的精度,就会使用该类型的精度。

precision highp float;
precision mediump int;

浮点指定精度将基于浮点的所有变量的默认精度,如果都没有指定,那么就会使用int和float的默认精度的最高精度。
精度选择:

  • 对于通常在顶点着色器中执行的操作,最可能需要的精度限定符是高精度限定符。
  • 用矩阵变换位置,变换法线和纹理坐标,或者生成纹理坐标的操作需要高精度地完成。
  • 颜色计算和光照方程很可能以中等精度完成。

这将取决于正在执行的颜色计算的种类以及正在执行的操作所需的范围和精度。我们相信highp很可能是顶点着色器中大多数操作使用的默认精度,因此在下面的示例中使用highp作为默认精度限定符。

ES2.0顶点着色器限制

open el es着色器语言的限制,帮助开发者编写便捷式的顶点着色器。

顶点着色器的长度

没有办法在所有的open gl中实现查询顶点着色器支持的最大指令数量,指定计数超过顶点着色器的最大指令数,顶点着色器将无法编译。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容