OpenGL ES 3.0入门之顶点着色器和程序介绍

原文地址: https://lm1024.xyz/archives/108

着色器

本文主要介绍顶点着色器和片段着色器在脚本执行过程是怎样被执行的。一般着色器包括两种(顶点着色器和片段着色器)每一个着色器从在程序运行的过程中都会经历 创建 -->加载 --> 编译 --> 创建着色程序--->将编译好的着色器连接到着色程序上---> 链接程序对象 --> 使用 的过程

image

统一变量和属性

统一变量——是存储应用程序通过OpenGL ES 3.0 API 传递给着色器的只读常数值的变量
1、命名统一变量块
概念:统一变量的值由统一变量缓冲区支持,会分配一个统一变量块索引
示例:


image

2、默认统一变量块
概念:在命名统一变量块之外的统一变量
示例:


image

3、 获取和设置统一变量
查询程序中活动统一变量的列表流程:

  • 使用glGetProgramiv获取统一变量的数量
  • 使用glGetProgramiv获取着色程序中最大统一变量名称的字符数
  • 使用glGetActiveUniform获取统一变量的细节
  • 使用glGetUniformLocation获取统一变量的位置
  • 加载统一变量的值,方法太多 后面会统一整理到一个API 附录中
GLint maxUniformLen;
GLint numUniforms;
char * uniformName;
GLint indenx;

glGetProgramiv (progObj, GL_ACTIVE_UNIFORMS, &numUniforms);
glGetProgramiv (progObj, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLen);

uniformName = malloc ( sizeof(char) * maxUniformLen);

for (index = 0; index < numUniforms; index++)
{
    GLint size;
    GLenum type;
    GLint locationl

    glGetActiveUniform (progObj, index, maxUniformLen, NULL, &size, &type, uniformName);

    location = glGetUniformLocation (progObj, uniformName);

    switch (type)
    {
        case GL_FLOAT:
            break;
        case GL_FLOAT_VEC2:
            break;
        default:
            break;
     }
}

4、统一对象缓冲区
定义:
使用缓冲区对象存储统一变量数据,从而在程序中的着色器之间甚至程序之间共享统一变量,这种缓冲区对象称作统一缓冲区对象
作用:
可以更新打的统一变量时降低API开销,增加统一变量的可用存储
统一变量在内存中的形式:

  • 类型为bool、int、uint和float成员保存在内存的特定偏移,分别记作为单个bool、int、unit和float的类型分量
  • 类型为bool、int、uint和float成员的向量保存在始于特定便宜的连续内存位置中,第一个分类在最低偏移处
  • C列R行的列优先矩阵被当成C浮点列向量的一个数据对待,每个向量包含R个分量
  • R行C列的行优先矩阵被当成R浮点向量的一个数组,每个向量包含C个分量
  • 标量、向量和矩阵的数组按照元素的顺序存储与内存中,成员0放在最低偏移处,数组中没对元素之间的偏移量是一个常数称作为数据跨距,可以在链接的程序中用glGetActiveUniformsiv查询

5、 std140布局

  • 标量变量 : 基线堆积是标量的大小,例如sizeof(GLint)
  • 2分量向量 : 基线对齐是基础分类类型大小的两倍
  • 3分量或者4分量向量 : 基线对齐是基础分量类型大小的4倍
  • 标量或者向量数组 : 基线对齐和数组跨距设置为匹配单元素数数组的基线对齐,整个数组被填充为vec4大小的倍数
  • C列R行的列优先矩阵 : 根据规整4,存储为一个右C个具有R个分类的向量组成的数组
  • M个C列R行的列有限矩阵组成的数组 : 根据规则4,存储为由M * C 个具有R个分量的向量组成的数组
  • C列R行的行优先矩阵 : 根据规则4,存储为一个由R个向量组成的数组,其中每个乡里有C个分量
  • M个C列R行的行优先矩阵 : 根据规则4,存储为由M*R个具有C个分量的向量组成的数组
  • 单个结构 : 根据前面的规则计算偏移和大小。结构的大小将填充为vec4大小的倍数
  • S个结构组成的数组 : 基线对齐根据数组元素的基线计算对齐,数组的元素根据『单个结构』规则计算

着色器编译器

当我们执行『shader创建编译过程』后可以调用glReleaseShaderCompiler释放掉着色器所占用的系统资源

程序二进制码

思考: 我们在执行了『shader创建编译过程后』能不能将我们编译好的着色程序保存程文件?
答案: 答案是可以的,程序二进制码是完全变一盒链接的程序的二进制表现形式。它们很有用,可以保存到文件系统供以后使用,conger避免在线编译的代价。也可以直接使用编译好的程序二进制码,这样没有必要在实现中分发这着色器源代码

流程:

  • 执行『shader编译链接』后使用 glGetProgramBinary检索程序二进制码
  • 使用glprogramBinary将其保存到文件系统,或者将程序二进制码读回OpenGL ES 实现

写在最后

都是概念真的不知道写点什么,把作者的总结贴上来吧

在本章节中,我们介绍了创建、编译和链接着色器到程序的方法。着色对象和程序对象组成了OpenGL ES 3.0中的基本对象。我们讨论了如何查找程序对象的信息以及加载统一变量的方法。此外,还学习了着色器源代码和程序二进制码的差别以及各自的使用方法。

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

推荐阅读更多精彩内容