android平台下OpenGL ES 3.0着色语言基础知识(上)

2023-11-08

OpenGL ES 3.0学习实践

本篇整理自《OpenGL ES 3.0 编程指南第2版》

着色器版本规范

OpenGL ES 3.0 顶点着色器片段着色器的第1行总是声明着色器版本。声明着色器版本通知着色器编译器预期在着色器中出现的语法和结构。编译器按照声明的着色语言版本检查着色器语法。采用如下语法声明着色器使用OpenGL ES着色语言3.00版本:

#version 300 es

没有声明版本号的着色器被认定为使用OpenGL ES着色语言的1.00版本。着色语言的1.00版本用于OpenGLES2.0。对于OpenGLES3.0,作者决定匹配API和着色语言的版本号,这就是版本号从1.00跳到3.00的原因。

变量和变量类型

在计算机图形中,两个基本数据类型组成了变换的基础:向量和矩阵。这两种数据类型 在OpenGLES着色语言中也是核心。

OpenGLES着色语言中的数据类型

变置分类 类 型 描 述
标量 float,int,uint,bool 用于浮点、整数、无符号整数和布尔值的基于标标量的数据类型
浮点向量 float,vec2,vec3,vec4 有1、2、3、4个分量的基于浮点的向量类型
整数向量 int,ivec2,ivec3,ivec4 有1、2、3、4个分量的基于整数的向量类型
无符号整数向量 uint,uvec2,uvec3,uvec4 有1、2、3、4个分量的基于无符号整数的向量类型
布尔向量 bool,bvec2,bvec3,bvec4, 有1、2.3、4个分量的基于布尔的向量类型
矩阵 mat2(或mat2x2),mat2x3,2x2,2x3,2x4,3x2,3x3,3x4,4x2,4x3mat2x4,mat3x2, mat3(或mat3x3),mat3x4,mat4x2,mat4x3,mat4(或mat4x4)

着色语言中的变量必须以某个类型声明。例如,下面的声明描述如何声明一个标量、一 个向量和一个矩阵

vec4 vPosition;
mat4 mMatirx;
vec2 vOffset;

变量可以在声明时或者声明以后初始化。初始化通过使用构造器进行,构造器也用于类
型转换。

变量构造器

OpenGLES着色语言在类型转换方面有非常严格的规则。也就是说变量只能陚值为相同类型的其他变量或者与相同类型的变量进行运算。

来看看如何使用构造器初始化和转换标量值。

float myFloat = 1.0;
float myFloat2 = 1; //ERROR: 整数类型转换浮点类型错误
bool myBool = true;
int mylnt = 0;
int mylnt2 = 0.0; // ERROR: 浮点类型转换整数类型错误
myFloat =	float(myBool);	//	布尔值转换为浮点型
myFloat =	float(mylnt);	//	整型转换为浮点型
myBool =	bool(mylnt);	//	整型转换为布尔值

构造器可以用于转换和初始化向量数据类型。向量构造器的参数将被转换为与被构造的向量相同的基本类型(float、int或bool)。向量构造器的参数传递有两种基本方法:

  • 如果只为向量构造器提供一个标量参数,则该值用于设置向量的所有值。
  • 如果提供了多个标量或者向量参数,则向量的值从左到右使用这些参数设置。如果提供了多个标量参数,那么在向量中必须有至少和参数中一样多的分量。

构造向量的例子:

vec4 myVec4 = vec4(1.0);	// myVec4 = {l.0, 1.0, 1.0, 1.0}
vec3 myVec3 = vec3(1.0,0.0,0.5);// myVec3 = {1.0, 0.0, 0.5}
vec3 temp = vec3(myVec3); // temp = myVec3
vec2 myVec2 = vec2(myVec3); // myVec2 = {myVec3.x,myVec3.y}
myVec4 = vec4(myVec2, temp); //myVec4 » {myVec2.x,myVec2.y,temp.x,temp.y}

下面是构造矩阵的一些基本规则:

  • 如果只为矩阵构造器提供一个标量参数,则该值被放在矩阵的对角线上。例如:mat4(1.0)将创建一个4 x 4的单位矩阵。
  • 矩阵可以从多个向量参数构造。例如: mat2可以从两个vec2构造
  • 矩阵可以从多个标量参数构造一每个参数代表矩阵中的一个值,从左到右使用。矩阵的构造比刚才说明的基本规则更灵活,只要在矩阵初始化时提供足够多的分量,矩阵基本上可以从任何标量和向量的组合构造。OpenGLES中的矩阵以列优先顺序存储。使用矩阵构造器时,参数按列填充矩阵。
mat3 myMat3 = mat3(1.0, 0.0, 0.0,	 //第一列
                   0.0, 1.0, 0.0,	 //第二列
                   0.0, 1.0, 1.0);//第三列
向量和矩阵分量

向量的单独分量可以用两种方式访问:

使用'.'运算符或者通过数组下标。根据组成向量的分量数,每个分量可以通过使用{x,y,z,w}{r,g,b,a}或者{s,t,p,q}组合访问。3种不同命名方案的原因是向量可以互换地用于表示数学上的向量、颜色和纹理坐标。

使用运算符时,可以在操作中重新排列向量的分量:

vec3 myVec3 = vec3(0.0, 1.0, 2.0);	// myVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp	=	myVec3.xyz;	//	temp	=	{0.0,	1.0,   2.0}
temp	=	myVec3.xxx;	//	temp	=   {0.0,	0.0,   0.0}
temp	=	myVec3.zyx;	//	temp	=	{2.0,	1.0,   0.0}

除了'.'运算符之外,向量还可以使用数组下标"[]"运算符访问。在数组下标中,元素[0]对应于x,元索[1]对应于y,等等。
矩阵被看成由一些向量组成。例如:mat2可以看作两个vec2,mat3可以看作3个vec3,等等。
对于矩阵,单独的列可以用数组下标运算符"[]"选择,然后每个向量可以通过向量访问行为来访问。

mat4 myMat4 = mat4(1.0);	// 将对角线初始化为1.0
vec4 myVec4 = myMat4[0]; // 从矩阵中获取myVec4向量
float m1_1 = myMat4[1][1]; // 在矩阵中获取 [1][1]处的元素
float m2_2 = myMat4[2][2]; // 在矩阵中获取 [2][2]处的元素
常量

可以将任何基本类型声明为常数变量。常数变量是着色器中不变的值。声明常量时,在声明中加入const限定符。常数必须在声明时初始化。

const float zero = 0.0;
const float pi = 3.14159;
const vec4 red = vec4(0.0, 0.0, 1.0);
const mat4 identity = mat4(1.0);

正如在C或者C++中那样,声明为const的变量是只读的,不能在源代码中修改。

结构

除了使用语言中提供的基本类型之外,还可以和c语言一样将变量聚合成结构OpenGL ES着色语言中声明结构的语法如下例所示:

struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;

上述定义的是一个名为fogStruct的新结构类型和一个新变量fogVar
结构可以用构造器初始化。在定义新的结构类型之后,也用与类型相同的名称定义一个新的结构构造器。结构中的类型和构造器中的类型必须是一对一的。

struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;

//构造初始化
fogVar = fogStruct(vec4(0.0, 1.0, 0.0, 0.0), //初始化颜色
                   0.5, //初始化 start
                   2.0); //初始化end
数组

数组的语法与C语言很相似,索引从0开始。数组可以用数组初始化构造器初始化

float a[4] = float[](1.0, 2.0, 3.0, 4.0);
float b[4] = float(4](1.0, 2.0, 3,0, 4.0);
vec2 c[2] = vec2[2]vec2(1.0), vec2(1.0));
函数

函数的声明方法和C语言中相同。如果函数在定义前使用,则必须提供原型声明。 OpenGLES着色语言函数和C语言函数的最明显的不同之处在于函数参数的传递方法。 OpenGLES着色语言提供特殊的限定符,定义函数是否可以修改可变参数。

OpenGL ES中也提供了很多内建函数

限定符 描述
in (没有指定时的默认限定符) 这个限定符指定参数按值传送,函数不能修改
inout 这个限定符规定变量按照引用传入函数,如果该值被修改,它将在函数退出后变化
out 这个限定符表示该变量的值不被传入函数,但在函数返冋时将被修改

注意:函数不能递归。GPU没有堆栈。

控制流语句

OpcnGL ES着色语言中的控制流语句的语法类似于C语言。

if(color.a < 0.25){
    color *= color.a;
}
else{
    color = vec4(0.0);
}

条件语句中测试的表达式求出的必须是一个布尔值。

参考
《OpenGL ES 3.0 编程指南第2版》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android平台下OpenGL ES 3.0着色语言基础知识(上) 的相关文章

  • onBeaconServiceConnect 未调用

    和以前一样 我使用 Android Beacon 库 它已经工作了 我可以通过 BLE 低功耗蓝牙找到信标 但是现在 更新到最新版本的库后 现在方法onBeaconServiceConnect 不再跑了 请告诉我我需要做什么才能让它发挥作用
  • Android webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • 如何强制 Eclipse 将 xml 布局和样式显示为文本?

    我最近升级到带有 ADT 20 0 3 的 Eclipse 4 2 Juno 如果我查看旧项目中的布局或样式 Eclipse 只会向我显示其适当的基于控件的编辑器 我想编辑语法突出显示的 xml 文本 我没有找到将插件的编辑器切换到此模式的
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 播放 SoundCloud 曲目

    我可以在 Android 应用程序中播放 SoundCloud 中的曲目吗 我正在尝试这段代码 但它不起作用 String res https api soundcloud com tracks 84973999 stream client
  • 从 React Native Js 代码调用 Android Native UI 组件方法

    我创建了一个 CustomView SignatureView java 它扩展了 LinearLayout 以捕获 Android Native 中的签名 并创建了SignatureCapturePackage java和Signatur
  • 如何解决 Firebase AuthUi 中无法找到显式活动?

    使用 firebase UI 时 我无法找到显式活动类 com firebase ui auth KickoffActivity protected void onCreate Bundle savedInstanceState super
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • Android 自定义布局 - onDraw() 永远不会被调用

    public class MainActivity extends Activity Override public void onCreate Bundle savedInstanceState super onCreate savedI
  • android EditText 输入类型用于 StreetNumber 字段

    我试图在地址对话框的 streetNumber 字段中选择正确的 inputType 我想先显示数字键盘 然后让用户输入字母字符 对于一些非常特殊的情况 更接近这个的是 inputType datetime 但这不允许输入字母字符 那么如何
  • 使用 Retrofit2 和 Mockito 或 Robolectric 进行 Android 单元测试

    我可以测试 Retrofit2beta4 的真实响应吗 我需要 Mockito 或 Robolectic 吗 我的项目中没有活动 它将是一个库 我需要测试服务器是否正确响应 现在我有这样的代码并卡住了 Mock ApiManager api
  • 使用 gradlew assembleRelease 从 React Native 创建发布 apk 时出现错误

    我想发布 apk 但我收到错误 文件已存在 mkdir D mobile 它在 d 驱动器中生成名为 mobile 的文件 删除文件后 再次执行 gradlew assembleRelease 创建该文件并抛出错误 任务 app bundl
  • PhoneStateListener 不调用

    这是我的完整代码 广播示例 java package com example broadcast gt import android app Activity import gt android content Context import
  • 在 Android 中调整可绘制对象的大小

    我正在为进度对话框设置一个可绘制对象 pbarDialog 但我的问题是我想每次调整可绘制的大小 但不知道如何调整 这是一些代码 Handler progressHandler new Handler public void handleM
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • Android:AsyncTask ProgressDialog 将不会在 ActivityGroup 中打开

    我试图在轮询我的服务器时打开一个进度对话框 该类是一个 ActivityGroup 因为它嵌套在选项卡栏中 为了将视图保持在框架内 需要 ActivityGroup 这是我的 ActivityGroup 类的声明 public class
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组

随机推荐

  • 量子通信(QKD)与BB84协议

    量子密钥分发 QKD Quantum key Distribution QKD是量子信息的一个重要分支 也称为 量子保密通信 一个量子通信的课程推荐给大家 论述的全面 详细 https ke qq com course 382160 一个系
  • c#文件下载示例的4种方法

    原文链接 http www jb51 net article 57068 htm C 实现HTTP下载文件的方法
  • 电脑可以聊微信但是无法上网页的解决方法

    电脑可以聊微信但是无法上网页 ping不通百度的IP地址 一般是电脑的DNS出现错误 解决方案如下 打开360安全卫士 点击功能大全中的断网急救箱 进行扫描 之后进行修复 问题即可解决
  • clickhouse重启报错以及远程无法连接

    1 启动报Processing configuration file etc clickhouse server config xml 文件没有写入权限 先添加写入权限 sudo chmod 600 etc clickhouse serve
  • JVM性能优化之Tomcat服务器参数配置优化

    前言 tomcat 服务器在JavaEE项目中使用率非常高 所以在生产环境对tomcat的优化也变得非常重要了 对于tomcat的优化 主要是从2个方面入手 一是tomcat本身的配置 另一个是tomcat所运行的Jvm虚拟机的调优 优化传
  • Windows XP环境下IPSec 隧道的配置

    前言 这是这学期防火墙课程的一个实验 觉得挺有意义 所以记录在博客里 一 实验目的 本实验主要验证IP通信在建立IPSec隧道前后的变化 为了简化实验过程 这里只对ICMP进行加密 但在配置的过程中即可发现 其他IP协议要进行同样的加密也是
  • 【轩说AI】生成模型(1)——自编码器AE+变分自编码器VAE

    文章目录 生成模型 从概率分布的角度去理解 生成 一张图片 生成宝可梦 生成系列图片 自动编码器Auto Encoder AE的模型及其存在的问题 AE中的高斯混合模型 AE的训练情况 举例理解从AE到VAE 变分自动编码器Variatio
  • 经典排序之快速排序

    一 概述 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法 其基本思想为 任取待排序元素序列中的某元素作为基准值 按照该排序码将待排序集合分割成两子序列 左子序列中所有元素均小于基准值 右子序列中所有元素均大于基准值 然后
  • 剑指offer 学习笔记 树中两个节点的最低公共祖先

    面试题68 树中两个节点的最低公共祖先 可以先得到从根节点到这两个节点的路径 之后找出最后一个公共节点 代码中的树为 include
  • 学习笔记-Matlab算法篇-现代优化算法

    现代优化算法 01遗传算法 定义 遗传算法 Genetic Algorithms 简称 GA 是一种基于自然选择原理和自然遗传机制的搜索 寻优 算法 它是模拟自然界中的生命进化机制 在人工系统中实现特定目标的优化 遗传算法的实质是通过群体搜
  • svn访问版本库时一直提示: please wait while the repository browser is initializing

    最近不知道做了什么操作 原来正常的SVN Check In Out都无法正常操作 正常Check In的动作 几秒钟就会操作完成 但是我却等了好久好久 然后提示Connection timed out 一开始怀疑是SVN Client的版本
  • 谷歌广告(Google ads)如何投放?新手必看的超全教程

    Google是公认的全球最大的搜索引擎 同时 Google还通过旗下的 YouTube Gmail Google Play Android等产品 汇集了海量的海外用户 对于跨境出海商家来说 谷歌广告是提高销售额 提高产品流量 拓展全球市场的
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别

    文章目录 前言 变量对比 0 i i var var var 总结 前言 最近使用批处理程序处理文件的时候 发现这 bat中的变量形式真是 变化多端 有时候加1个百分号 有时候加2个百分号 还有的时候加感叹号 真是让初学者一头雾水 于是查询
  • Spring核心方法 refresh 解析

    refresh 方法简述 refresh 是 Spring 最核心的方法 没有之一 上帝就是用这个方法创造了 Spring 的世界 这是一个同步方法 用synchronized关键字来实现的 该方法包含以下12个核心方法 步骤 prepar
  • **关于使用adb时遇到mount:read only file system 或者是adb remount:read only file system时的处理方法如下

    关于使用adb时遇到mount read only file system 或者是adb remount read only file system时的处理方法如下 本文所述的方法适用于无法用mout命令修改 system只读权限 ro 的
  • 元素定位之css selector(选择器定位)

    语法 find element by css selector css选择器定位策略 或者 find elements by css selector css选择器定位策略 1 css可以通过元素的 id class 标签 这三个常规属性直
  • TensorRT加速Deformable Detr实践

    TensorRT加速Deformable Detr实践 自TensorRT 8 4 1 5发布以来 惊喜的发现TensorRT官方实现了可变形transformer的插件 这让TensorRT便捷实现加速Deformable Detr乃至今
  • 在python控制台输入变量,判断奇偶

    原题 从python控制台输入变量x 然后判断这个x是奇数还是偶数 并且需要将这一过程放到循环中 这样可以不断输入要判断的数值 直到输入end退出循环 需要用到的知识点 1 在控制台输入 2 while语句 3 if语句及if语句的嵌套使用
  • 类-1246

    1246 设计回文判断类 题目描述 分析下面所给自定义类 myStrCla 以及随后给出的主函数及该程序执行后的屏幕显示结果 而后在类体外给出 补充 其三个成员函数的具体实现 用于完成所设定的自定义功能 以使程序执行后的屏幕显示结果为 ab
  • android平台下OpenGL ES 3.0着色语言基础知识(上)

    OpenGL ES 3 0学习实践 android平台下OpenGL ES 3 0从零开始 android平台下OpenGL ES 3 0绘制纯色背景 android平台下OpenGL ES 3 0绘制圆点 直线和三角形 android平台