OpenGL ES 光照计算(v15)

一:顶点着色器

precision highp float;

varying lowp vec2 vTextCoor;
varying lowp vec4 varyColor;
uniform sampler2D colorMap;

void main()
{
   vec4 weakMask = texture2D(colorMap, vTextCoor);
    vec4 mask = varyColor;
    float alpha = 0.3;
    
    vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
    gl_FragColor = tempColor;
}

// gl_Position
// gl_PointSize
2:顶点着色器任务

1:矩阵变换位置
2:计算光照公式生成逐顶点颜色
3:生成/变换纹理坐标
总结:它可以用于执行自定义计算,实施新的变换,照明或者传统的固定功能所不允许的基于顶点的效果。

3:顶点着色器内建特殊变量
gl_VertexID
gl_InstanceID
gl_Position
gl_PointSize
gl_FrontFacing
4:内建Uniform--统一变量

参考:https://blog.csdn.net/linuxheik/article/details/79582106
shader中与外部连接的常量,初始化之后不能够修改其值。否则会引起编译错误。
在shader中定义

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;

在外部调用

  //11.找到myProgram中的projectionMatrix、modelViewMatrix 2个矩阵的地址。如果找到则返回地址,否则返回-1,表示没有找到2个对象。
    GLuint projectionMatrixSlot = glGetUniformLocation(self.myProgram, "projectionMatrix");
    GLuint modelViewMatrixSlot = glGetUniformLocation(self.myProgram, "modelViewMatrix");
5:顶点着色器内建常量
const mediump int gl_MaxVertexAttribs = 16;             //顶点着色器中属性的最大数量
const mediump int gl_MaxVertexUniformVectors = 256;     //顶点着色器中统一变量的最大数量
 const mediump int gl_MaxVertexOutputVectors = 16;     //顶点着色器中输出向量的最大数量
const mediump int gl_MaxVertexTextureImageUnits = 16;  //顶点着色器中纹理单元的最大数量
const mediump int gl_MaxCombinedTextureImageUnits = 32;//顶点着色器和片元着色器中纹理单元最大数量的总和

6:内建特殊变量
变量 描述
gl_VertexID 输入变量,用于保存顶点的整数索引。highp 精度的整数变量
gl_InstanceID 输入变量,用于保存实例化绘图调用中图元的实例编号。highp 精度的整数变量,通常情况下为 0
gl_Position 输出变量,用于输出顶点作为的裁剪坐标。highp 精度的浮点变量
gl_PointSize 用于指定点精灵的尺寸,单位为像素。highp 精度的浮点变量
gl_FrontFacing 不由顶点着色器直接写入,而是根据顶点着色器生成的位置值和渲染的图元类型生成,它是一个布尔变量

6:顶点着色器矩阵变换

MVP(矩阵变换)
模型--->视图--->投影

二:片元着色器

precision highp float;

varying lowp vec2 vTextCoor;
varying lowp vec4 varyColor;
uniform sampler2D colorMap;

void main()
{

    vec4 weakMask = texture2D(colorMap, vTextCoor);
    vec4 mask = varyColor;
    float alpha = 0.3;
    
    vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
    gl_FragColor = tempColor;
}
//gl_FragColor
2:片元着色器业务

1:计算颜色
2:获取纹理
3:往像素点中填充颜色值【纹理值/颜色值】
总结:它可以用于图片。视频。图形中每个像素的颜色填充【比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改】

3:内建常量
const mediump int gl_MaxFragmentInputVectors = 15; //片元着色器出入的最大数量
const mediump int gl_MaxTextureImageUnits = 16;//可用纹理图像单元的最大数量
const mediump int gl_MaxFragmentUniformVectors = 224;//片元着色器可用vec4 uniform变量的最大数量
const mediump int gl_MaxDrawBuffers = 4; //多重渲染目标最大支持数量
4:内建特殊变量
变量 描述
gl_FragCoord 只读变量,这个变量保存片元的窗口相对坐标
gl_ForntFacing 只读变量,这个布尔变量是正面图元时为true否则为false
gl_PointCoord 只读变量,可以在渲染点精灵的时候使用,保存了点精灵的纹理坐标,这个坐标在点精灵光栅化期间自动生成,处于(0,1)区间。
gl_FragDepth 一个只写输出变量,在片元着色器写入时,覆盖片元的固定功能深度值,尽量减少手动实现深度值写入,这个功能需要谨慎使用,因为它可能禁用许多GPU的深度优化,例如:许多GPU都有“Early-z”的功能,在执行片元着色器之前进行深度测试,使用“Early-z”的好处就是不能通过深度测试的片元就不会被着色(从而降低了着色器的调用次数,提高了性能)但是使用gl_FragDepth,就必须禁用该功能,因为GPU在执行着色器之前不知道深度值。
5:内建函数

常用内建函数

函数 说明
dot 点乘
cross 叉乘
texture2D 用于对纹理采样
normalize 对于一个向量规格化
clamp 将一个向量固定在一个最小值和最大值之间
pow 幂函数(对矢量和标量同样有效,下同)
exp,log 指数函数,对数函数
abs 绝对值
sqrt 平方根
max,min 最值
ceil,floor 去大于实参的最小整数,取小于实参的最大整数
sin,cos,tan 正三角函数
asin,acos,atan 反三角函数
length 向量长度
distance 两个向量的距离
matrixCompMult 矩阵对应元素分别相乘
transpose,determinant,inverse 矩阵的转置,行列式,逆
lessThan,greaterThan,equal 小于,大于,等于(对实参向量对应位置的每个分量做大小比较,生成布尔向量)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容