opengl es 着色器

着色器一种依赖于GPU硬件的程序,使用着色器语言编写,着色器语言有多种,这里使用的是基于OpenGL的GLSL,关于GLSL的详细信息大家可以自行在网上查阅,提供一个参考GLSL参考

这个需要补充个OpenGL渲染管线的知识,从csdn博客上搬运来的。

OpenGL 渲染管线示意图

上图即为OpenGL渲染管线的基本示意图,可以看出它像一个生产流水线一样,其中灰色部分为本文介绍的可以编程的着色器。至于其他部分做个简单的介绍:
Primitive Assembly:图元装配,经过着色器处理之后的顶点在该阶段被装配为OpenGL ES支持的基本图元(点、线、三角形),接着对装配好的图元进行裁剪,保留完全在视锥体中的图元,丢弃完全不在视锥体中的图元,对一半在一半不在的图元进行裁剪;接着再对在视锥体中的图元进行剔除处理;这个过程可编码来决定是剔除正面,背面还是全部剔除。
Rasterization:光栅化。在光栅化阶段,基本图元被转换为二维的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。这些片元接着被送到片元着色器中处理。这是从顶点数据到可渲染在显示设备上的像素的质变过程。
Per-Fragment Operation:在这一阶段对片元着色器输出的每一个片元进行一系列测试与处理,从而决定最终用于渲染的像素。

1、顶点着色器(Vertex Shader)

 attribute vec4 position;
 attribute vec2 texCoord;
 varying vec2 v_textureCoordinate;
 uniform mat4 modelViewProjectionMatrix;
 void main() {
     v_textureCoordinate = texCoord;
     gl_Position = modelViewProjectionMatrix * position;
 }

这里我只解释下当前shader里的各个字符的意思:

attribute是属性限定符,其修饰的变量用来接收渲染管线传递进顶点着色器的当前待处理顶点的各种属性值。用attribute限定符修士的变量其值是由宿主程序批量出入渲染管线的,管线进行基本处理后再传递给顶点着色器。数据中有多少个顶点,管线就调用多少次顶点着色器,每次将一个顶点的各种属性数据传递给顶点着色器中对应atribute变量。因此,顶点着色器每次执行将完成对一个顶点各项属性数据的处理。

uniform为一致变量限定符,一致变量指的是对于同一组顶点组成的单个3D物体中所有顶点都相同的量。Uniform变量可以用在顶点着色器或片元着色器中,其支持用来修饰所有的基本数据类型。一致变量的值也是从宿主程序传入的。

varying表示用于从顶点着色器传递到片元着色器的量。

vec4表示包含4个浮点数的向量,同理vec2表示包含2个浮点数的向量。由于GPU的特性,在运算中会大量使用向量和矩阵。

mat4表示一个4*4的浮点数矩阵。

gl_Position为系统内建变量,表示原始的顶点数据在顶点着色器中经过平移、旋转、缩放等数学变换后,生成新的顶点位置。这些内建变量不需要声明就可以使用,一般用来实现渲染管线固定功能部分与自定义顶点或片元着色器之间的信息交互。顶点着色器中的内建变量主要是输出变量,包括gl_Position、gl_PointSize等。在顶点着色器中应该根据需要给这些内建变量赋值,以便由渲染管线中的图元装配与光栅化等后续固定功能阶段进行进一步的操作。

2、片元着色器(fragment shader)

 precision mediump float;
 
 uniform sampler2D SamplerY;
 uniform sampler2D SamplerUV;
 
 varying mediump vec2 v_textureCoordinate;
 
 uniform mat3 colorConversionMatrix;
 
 void main() {
     mediump vec3 yuv;
     lowp vec3 rgb;
     
     yuv.x = texture2D(SamplerY, v_textureCoordinate).r - (16.0/255.0);
     yuv.yz = texture2D(SamplerUV, v_textureCoordinate).rg - vec2(0.5, 0.5);
     
     rgb = colorConversionMatrix * yuv;
     
     gl_FragColor = vec4(rgb, 1);
 }

precision precision-qualifier type表示指定默认精度。precision可以用来确定默认精度修饰符。type可以是int或float或采样器类型,precision-qualifier可以是lowp, mediump, 或者highp。顶点着色器是有默认精度的,而片元着色器没有。各个精度的标准如下:

GLSL 精度

sampler2D:sample表示采样器类型,实际上是纹理的不透明句柄。2D表示纹理的类型是2D的。它们用在内建的纹理函数来指明要访问哪一个纹理。它们只能被声明为函数参数或uniforms。除了纹理查找函数参数, 数组索引, 结构体字段选择和圆括号外,取样器不允许出现在表达式中。

texture2D:纹理查找函数。用于实现从指定纹理中查找某个坐标的纹理数据。

colorConversionMatrix:颜色变换矩阵,由OpenGL ES API指定。在解码视频或者流数据,我们一般会得到YUV数据,YUV到RGB颜色空间的转换可以通过颜色变换矩阵实现。当然,你也可以自己手动计算,具体方式可自行查阅。

3、如果只是显示一个RGB的图片,可以使用下面的shader:

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

推荐阅读更多精彩内容