OpenGL ES Shading Language 2.0 参考笔记

2024-04-12 21:18

本文主要是介绍OpenGL ES Shading Language 2.0 参考笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenGL ES Shading Language 2.0 参考笔记

这里只是一份简略的笔记,仅为方便参考而已,更详细的信息可以参考这里

类型(type)

标量类型(scalar type)

类型名说明示例注意点
void无类型void function(void);
bool布尔类型bool bValue = true;不支持隐式类型转换,但是可以借助构造方式来进行类型转换,就像这样: bool bValue = bool(iValue);
int整数类型int iValue = 1;不支持隐式类型转换,但是可以借助构造方式来进行类型转换,就像这样: int iValue = int(bValue);
float浮点类型float fValue = 1.0;不支持隐式类型转换,但是可以借助构造方式来进行类型转换,就像这样: float fValue = float(iValue);

向量类型(vector type)

类型名说明示例注意点
bvec22维(2分量)布尔向量bvec2 bVec2 = bvec2(true, true);
1. 可以使用标量类型对向量的各个分量分别进行初始化
2. 如果初始化参数是单个标量,则向量的各个分量都初始化为该标量
3.如果使用高维向量初始化低维向量,则低维向量的各个分量分别使用高维向量中对应的分量进行初始化 例如
bvec2 bVec2 = bvec2(bVec3);
等价于
bvec2 bVec2 = bvec2(bVec3.x, bVec3.y);
4. 使用低维向量初始化高维向量是不允许的,但是可以使用低维向量与(或)标量类型组合的方式来初始化高维向量,但是组合对应的参数数量需要至少为高维向量的分量个数. 例如
vec3 bVec3 = bvec3(bVec2, bValue);
vec3 bVec3 = bvec3(bVec2.x, bVec2.y, bValue);

5. 可以使用向量的构造方式来进行不同向量类型间的转化,其中向量的各个分量会自动进行相应的类型转换 例如
bvec2 bVec2 = bvec2(iVec2);
bvec33维(3分量)布尔向量bvec3 bVec3 = bvec3(true, true, true);同上
bvec44维(4分量)布尔向量bvec4 bVec4 = bvec4(true, true, true, true);同上
ivec22维(2分量)整数向量ivec2 iVec2 = ivec2(1, 1);同上
ivec33维(3分量)整数向量ivec3 iVec3 = ivec3(1, 1, 1);同上
ivec44维(4分量)整数向量ivec4 iVec4 = ivec4(1, 1, 1, 1);同上
vec22维(2分量)浮点向量vec2 fVec2 = vec2(1.0, 1.0);同上
vec33维(3分量)浮点向量vec3 fVec3 = vec3(1.0, 1.0, 1.0);同上
vec44维(4分量)浮点向量vec4 fVec4 = vec4(1.0, 1.0, 1.0, 1.0);同上

矩阵类型(matrix type)

类型名说明示例注意点
mat22x2浮点矩阵mat2 aMat2 = mat2(1.0, 0.0, // first column
0.0, 1.0); // second column
mat2 bMat2 = mat2(1.0);
mat2 cMat2 = mat2(aVec2, bVec2);
mat2 dMat2 = mat2(aVec3, aFloat);

1. 可以使用标量类型初始化矩阵的各个元素,矩阵按列顺序分别进行对应元素的初始化
2. 如果初始化参数是单个标量,则矩阵使用该标量初始化主对角线元素(注意,不是所有元素)
3. 可以使用向量与(或)标量类型组合的方式来初始化矩阵,但是组合对应的参数数量需要至少为矩阵的元素个数
4. 使用[col_index]可以访问矩阵的列向量,使用[col_index][row_index]可以访问矩阵的元素
mat33x3浮点矩阵mat3 aMat3 = mat3(1.0, 0.0, 0.0, // 1. column
0.0, 1.0, 0.0, // 2. column
0.0, 0.0, 1.0); // 3. column
mat3 bMat3 = mat3(1.0);
mat3 cMat3 = mat3(aVec3, bVec3, cVec3);
mat3 dMat3 = mat3(aVec4, aVec3, bVec4, aFloat);
同上
mat44x4浮点矩阵mat4 aMat4 = mat4(1.0, 0.0, 0.0, 0.0, // 1. column
0.0, 1.0, 0.0, 0.0, // 2. column
0.0, 0.0, 1.0, 0.0, // 3. column
0.0, 0.0, 0.0, 1.0); // 4. column
mat4 bMat4 = mat4(1.0);
mat4 cMat4 = mat4(aVec4, bVec4, cVec4, dVec4);
mat4 dMat4 = mat4(aVec4, aVec3, bVec4, cVec4, aFloat);
同上

贴图类型(texture type)

类型名说明示例注意点
sampler2D2维贴图uniform sampler2D texture;需要声明为 uniform(限定符参考)
samplerCube立方体贴图uniform samplerCube texture;需要声明为 uniform(限定符参考)

结构(struct)

  1. 结构可以组合使用上面所提到的标准类型
  2. 结构可以包含数组或者结构
  3. 可以使用构造方式初始化结构,但初始化参数类型必须与结构定义类型一一对应
  4. 结构中的元素可以使用点号(.)进行访问

声明
struct matStruct {
vec4 ambientColor;
vec4 diffuseColor;
vec4 specularColor;
float specularExponent;
};

构造
newMaterial = matStruct(vec4(0.1, 0.1, 0.1, 1.0),
vec4(1.0, 0.0, 0.0, 1.0),
vec4(0.7, 0.7, 0.7, 1.0),
50.0);

访问
vec4 ambientColor = newMaterial.ambientColor;
vec4 diffuseColor = newMaterial.diffuseColor;
vec4 specularColor = newMaterial.specularColor;
float specularExponent = newMaterial.specularExponent;

数组(array)

  1. 数组可以包含标准类型及结构类型
  2. 数组声明时不能就地初始化
  3. 数组需要以逐个元素的方式进行初始化

int newIntArray[9];
vec3 newVec3Array[3];

newIntArray[0] = 5;
newVec3Array[1] = vec3(1.0, 1.0, 1.0);

int newInt = newIntArray[0];
vec3 newVec3 = newVec3Array[1];

限定符(qualifier)

存储限定符(storage qualifier)

限定符说明示例注意点
const常量限定符const float PI = 3.1415926;
1. 编译时常量
2. 只读函数参数
attribute-attribute vec4 a_position;
1. 一般用于限定 OpenGL ES 环境向 vertex shader 传送顶点的各个属性,譬如位置,朝向,顶点贴图坐标等等
2. 限定的数据不可更改
3. 限定的数据 vertex shader 可见, fragment shader 不可见
4. 只可以限定浮点类型的数据(浮点标量,浮点向量,(浮点)矩阵),不能限定浮点类型数组
5. 需要在运行shader前加载好相应的限定数据
uniform-uniform vec2 u_resolution;
1. 一般用于限定一次渲染流程中不会改变的属性,譬如投影矩阵,光源位置,材质颜色等等
2. 限定的数据不可更改
3. 限定的数据 vertex shader 和 fragment shader 都可见,需要保证定义唯一
4. 需要在运行shader前加载好相应的限定数据
varying-varying vec2 v_texCoord;
1. 一般用于限定在 vertex shader 中进行计算并需要向 fragment shader 传递的数据
2. 限定的数据会首先由 vertex shader 进行初始化计算并经过光栅化阶段的插值再传递给 fragment shader
3. 限定的数据 vertex shader 和 fragment shader 都可见,需要保证定义唯一
4. 只可以限定浮点类型的数据(浮点标量,浮点向量,(浮点)矩阵以及包含这些类型的数组)

精度限定符(precision qualifier)

限定符说明示例注意点
highp高精度限定符uniform highp vec3 lightDirection;
1. 用于限定某个变量使用定义类型的最高精度
2. 只可用于限定整型标量,整型向量,浮点标量,浮点向量及(浮点)矩阵
3. 在 vertex shader 中精度限定符是可选的,默认使用 highp,即最高精度
4. 在 fragment shader 中精度限定符是必选的,除非你定义了相应类型的默认精度(使用precision限定符)
5. 精度的具体标识范围由具体的 OpenGL ES 实现决定,一般来讲,使用低精度可以提高渲染效率但是也会降低渲染质量
mediump中精度限定符varying mediump vec2 textureCoordinate;
1. 用于限定某个变量使用定义类型的中等精度
2. 只可用于限定整型标量,整型向量,浮点标量,浮点向量及(浮点)矩阵
3. 在 vertex shader 中精度限定符是可选的,默认使用 highp,即最高精度
4. 在 fragment shader 中精度限定符是必选的,除非你定义了相应类型的默认精度(使用precision限定符)
lowp低精度限定符varying lowp vec4 colorVarying;
1. 用于限定某个变量使用定义类型的低等精度
2. 只可用于限定整型标量,整型向量,浮点标量,浮点向量及(浮点)矩阵
3. 在 vertex shader 中精度限定符是可选的,默认使用 highp,即最高精度
4. 在 fragment shader 中精度限定符是必选的,除非你定义了相应类型的默认精度(使用precision限定符)
precision默认精度限定符precision highp float;
1. 用于限定某种类型的默认精度
2. 只可用于限定整型标量,整型向量,浮点标量,浮点向量及(浮点)矩阵
3. 在 vertex shader 中默认精度是 highp,即最高精度
4. 在 fragment shader 中精度限定符是必选的,除非你定义了相应类型的默认精度

参数限定符(parameter qualifier)

限定符说明示例注意点
in只读参数限定符int newFunction(in bvec4 aBvec4, // read-only
out vec3 aVec3, // write-only
inout int aInt); // read-write
函数参数的默认限定符即为 in ,即函数参数默认都是只读的
out只写参数限定符int newFunction(in bvec4 aBvec4, // read-only
out vec3 aVec3, // write-only
inout int aInt); // read-write

1. 函数参数会以引用方式传递
2. 函数参数只可写不可读
inout读写参数限定符int newFunction(in bvec4 aBvec4, // read-only
out vec3 aVec3, // write-only
inout int aInt); // read-write

1. 函数参数会以引用方式传递
2. 函数参数可读可写

内建的变量与常量(built-in variables and constants)

顶点着色器特殊输出变量(special output variables of the vertex shader)

变量名说明示例注意点
gl_Position顶点位置highp vec4 gl_Position;
1. vertex shader 中必须为 gl_Position 赋值
2. gl_Position 需要变换到裁剪空间中
gl_PointSize点大小mediump float gl_PointSize;
1. 数值大小为点半径的像素大小
2. 点实际使用quad渲染
3. 渲染图元为点(GL_POINTS)时才会生效

片段着色器特殊输入变量(special input variables of the fragment shader)

变量名说明示例注意点
gl_FragCoord片段坐标mediump vec4 gl_FragCoord;
1. 只读变量
2. 定义于窗口坐标空间中,默认左下角为窗口坐标原点
gl_FrontFacing片段朝向bool gl_FrontFacing;
1. 只读变量
2. 标识片段是否属于正朝向图元(三角形图元)
gl_PointCoord点坐标mediump vec2 gl_PointCoord;
1. 只读变量
2. 渲染图元为点(GL_POINTS)时才可访问
3. 片元位于点图元的归一化位置,默认点图元左上角为归一化空间原点(gl_PointCoord 分量范围为(0, 1))

片段着色器特殊输出变量(special output variables of the fragment shader)

变量名说明示例注意点
gl_FragColor片段颜色mediump vec4 gl_FragColor;
1. fragment shader 中必须为 gl_FragColor 赋值
2. gl_FragColor 定义于 RGBA 颜色空间中

顶点着色器内建常量(built-in constants of vertex shader)

常量名说明示例注意点
gl_MaxVertexAttribs-const mediump int gl_MaxVertexAttribs;
1. vertex shader 中 attribute 限定数据的最大个数(单位最大为vec4大小)
2. 实际大小由 OpenGL ES 实现决定, 至少为 8
gl_MaxVertexUniformVectors-const mediump int gl_MaxVertexUniformVectors;
1. vertex shader 中 uniform 限定数据的最大个数(单位最大为vec4大小)
2. 实际大小由 OpenGL ES 实现决定, 至少为 128
gl_MaxVaryingVectors-const mediump int gl_MaxVaryingVectors;
1. vertex shader 和 fragment shader 中 varying 限定数据的最大个数(单位最大为vec4大小)
2. 实际大小由 OpenGL ES 实现决定, 至少为 8
gl_MaxVertexTextureImageUnits-const mediump int gl_MaxVertexTextureImageUnits;
1. vertex shader 中可以使用的最大贴图数量
2. 实际大小由 OpenGL ES 实现决定, 至少为 0, 即在 vertex shader 中无法访问纹理
gl_MaxCombinedTextureImageUnits-const mediump int gl_MaxCombinedTextureImageUnits;
1. vertex shader 或者 fragment shader 中可以使用的最大贴图数量
2. 实际大小由 OpenGL ES 实现决定, 至少为 8

片段着色器内建常量(built-in constants of fragment shader)

常量名说明示例注意点
gl_MaxTextureImageUnits-const mediump int gl_MaxTextureImageUnits;
1. fragment shader 中可以使用的最大贴图数量
2. 实际大小由 OpenGL ES 实现决定, 至少为 8
gl_MaxFragmentUniformVectors-const mediump int gl_MaxFragmentUniformVectors;
1. fragment shader 中 uniform 限定数据的最大个数(单位最大为vec4大小)
2. 实际大小由 OpenGL ES 实现决定, 至少为 16
gl_MaxDrawBuffers-const mediump int gl_MaxDrawBuffers;
1. 最大的可用渲染缓存数量
2. 当前大小固定为 1

语法声明(statements)

基本与 C 无异,简单列几点:

循环(loop)

for(;;) {} 示例 for(int i = 0; i <= 99; i++) { aFunction(); }

while() {} 示例 while(i <= 99) { aFunction(); }

do {} while(); 示例 do { aFunction(); } while(i <= 99);

循环中可以使用 continue(终止单遍循环) 和 break(终止整个循环)

条件(condition)

if() {} 示例 if(i != 0) { aFunction(); }

if() {} else {} 示例 if(i != 0) { aFunction(); } else { bFunction(); }

退出(exit)

可以使用 return; 退出无返回的函数

可以使用 return aValue; 退出对应返回值类型的函数

在 fragment shader 中可以使用 discard; 中断 fragment shader 的运行,对应的片元也不会被渲染

起始(start)

main 函数为 vertex shader 和 fragment shader 的入口函数,没有参数,也没有返回类型

void main(void) {}

内建函数(built-in functions)

角度与三角函数(angle and trigonometry functions)

函数名说明示例注意点
radians角度转弧度float radians(float degrees)
vec2 radians(vec2 degrees)
vec3 radians(vec3 degrees)
vec4 radians(vec4 degrees)
参数类型可以为浮点标量或者浮点向量
degrees弧度转角度float degrees(float radians)
vec2 degrees(vec2 radians)
vec3 degrees(vec3 radians)
vec4 degrees(vec4 radians)
参数类型可以为浮点标量或者浮点向量
sin正弦函数float sin(float angle)
vec2 sin(vec2 angle)
vec3 sin(vec3 angle)
vec4 sin(vec4 angle)

1. 参数为弧度
2. 参数类型可以为浮点标量或者浮点向量
cos余弦函数float cos(float angle)
vec2 cos(vec2 angle)
vec3 cos(vec3 angle)
vec4 cos(vec4 angle)

1. 参数为弧度
2. 参数类型可以为浮点标量或者浮点向量
tan正切函数float tan(float angle)
vec2 tan(vec2 angle)
vec3 tan(vec3 angle)
vec4 tan(vec4 angle)

1. 参数为弧度
2. 参数类型可以为浮点标量或者浮点向量
asin反正弦函数float asin(float x)
vec2 asin(vec2 x)
vec3 asin(vec3 x)
vec4 asin(vec4 x)

1. 返回值为弧度
2. 参数类型可以为浮点标量或者浮点向量
acos反余弦函数float acos(float x)
vec2 acos(vec2 x)
vec3 acos(vec3 x)
vec4 acos(vec4 x)

1. 返回值为弧度
2. 参数类型可以为浮点标量或者浮点向量
atan反正切函数float atan(float y_over_x)
vec2 atan(vec2 y_over_x)
vec3 atan(vec3 y_over_x)
vec4 atan(vec4 y_over_x)
float atan(float y, float x)
vec2 atan(vec2 y, vec2 x)
vec3 atan(vec3 y, vec3 x)
vec4 atan(vec4 y, vec4 x)

1. 返回值为弧度
2. 参数类型可以为浮点标量或者浮点向量
3. 注意该函数具有两参数版本,等价于C语言中atan2函数

指数函数(exponential functions)

函数名说明示例注意点
pow-float pow(float x, float y)
vec2 pow(vec2 x, vec2 y)
vec3 pow(vec3 x, vec3 y)
vec4 pow(vec4 x, vec4 y)

1. 返回 x^y
2. 参数类型可以为浮点标量或者浮点向量
exp-float exp(float x)
vec2 exp(vec2 x)
vec3 exp(vec3 x)
vec4 exp(vec4 x)

1. 返回 e^x
2. 参数类型可以为浮点标量或者浮点向量
log-float log(float x)
vec2 log(vec2 x)
vec3 log(vec3 x)
vec4 log(vec4 x)

1. 返回 loge(x),即以e为底的对数函数
2. 参数类型可以为浮点标量或者浮点向量
exp2-float exp2(float x)
vec2 exp2(vec2 x)
vec3 exp2(vec3 x)
vec4 exp2(vec4 x)

1. 返回 2^x
2. 参数类型可以为浮点标量或者浮点向量
log2-float log2(float x)
vec2 log2(vec2 x)
vec3 log2(vec3 x)
vec4 log2(vec4 x)

1. 返回 log2(x),即以2为底的对数函数
2. 参数类型可以为浮点标量或者浮点向量
sqrt-float sqrt(float x)
vec2 sqrt(vec2 x)
vec3 sqrt(vec3 x)
vec4 sqrt(vec4 x)

1. 返回 x 的平方根
2. 参数类型可以为浮点标量或者浮点向量
inversesqrt-float inversesqrt(float x)
vec2 inversesqrt(vec2 x)
vec3 inversesqrt(vec3 x)
vec4 inversesqrt(vec4 x)

1. 返回 x 的平方根的倒数
2. 参数类型可以为浮点标量或者浮点向量

一般函数(common functions)

函数名说明示例注意点
abs绝对值函数float abs(float x)
vec2 abs(vec2 x)
vec3 abs(vec3 x)
vec4 abs(vec4 x)

1.
x >= 0 返回 x
x < 0 返回 -x
2. 参数类型可以为浮点标量或者浮点向量
sign符号函数float sign(float x)
vec2 sign(vec2 x)
vec3 sign(vec3 x)
vec4 sign(vec4 x)

1.
x > 0 返回 1
x = 0 返回 0
x < 0 返回 -1
2. 参数类型可以为浮点标量或者浮点向量
floor下取整函数float floor(float x)
vec2 floor(vec2 x)
vec3 floor(vec3 x)
vec4 floor(vec4 x)

1. 返回 <= x 的最大整数
2. 参数类型可以为浮点标量或者浮点向量
3. 函数仍然使用浮点类型返回整数结果
ceil上取整函数float ceil(float x)
vec2 ceil(vec2 x)
vec3 ceil(vec3 x)
vec4 ceil(vec4 x)

1. 返回 >= x 的最小整数
2. 参数类型可以为浮点标量或者浮点向量
3. 函数仍然使用浮点类型返回整数结果
fract-float fract(float x)
vec2 fract(vec2 x)
vec3 fract(vec3 x)
vec4 fract(vec4 x)

1. 返回 x 的小数部分,即返回 x - floor(x)
2. 参数类型可以为浮点标量或者浮点向量
mod取模函数float mod(float x, float y)
vec2 mod(vec2 x, vec2 y)
vec3 mod(vec3 x, vec3 y)
vec4 mod(vec4 x, vec4 y)
vec2 mod(vec2 x, float y)
vec3 mod(vec3 x, float y)
vec4 mod(vec4 x, float y)

1. 返回 x % y 或者说返回 x - y * floor(x / y)
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数为浮点向量第二参数为浮点标量的函数版本
min最小值函数float min(float x, float y)
vec2 min(vec2 x, vec2 y)
vec3 min(vec3 x, vec3 y)
vec4 min(vec4 x, vec4 y)
vec2 min(vec2 x, float y)
vec3 min(vec3 x, float y)
vec4 min(vec4 x, float y)

1. 返回 x 和 y 的较小值
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数为浮点向量第二参数为浮点标量的函数版本
max最大值函数float max(float x, float y)
vec2 max(vec2 x, vec2 y)
vec3 max(vec3 x, vec3 y)
vec4 max(vec4 x, vec4 y)
vec2 max(vec2 x, float y)
vec3 max(vec3 x, float y)
vec4 max(vec4 x, float y)

1. 返回 x 和 y 的较大值
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数为浮点向量第二参数为浮点标量的函数版本
clamp-float clamp(float x, float minVal, float maxVal)
vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal)
vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal)
vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal)
vec2 clamp(vec2 x, float minVal, float maxVal)
vec3 clamp(vec3 x, float minVal, float maxVal)
vec4 clamp(vec4 x, float minVal, float maxVal)

1.
x >= minVal 并且 x <= maxVal 返回 x
x < minVal 返回 minVal
x > maxVal 返回 maxVal
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数为浮点向量第二参数及第三参数为浮点标量的函数版本
mix-float mix(float x, float y, float a)
vec2 mix(vec2 x, vec2 y, vec2 a)
vec3 mix(vec3 x, vec3 y, vec3 a)
vec4 mix(vec4 x, vec4 y, vec4 a)
vec2 mix(vec2 x, vec2 y, float a)
vec3 mix(vec3 x, vec3 y, float a)
vec4 mix(vec4 x, vec4 y, float a)

1. 按 a 对 x 和 y 进行线性插值,即返回 (1 - a) * x + a * y
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数及第二参数为浮点向量第三参数为浮点标量的函数版本
step-float step(float edge, float x)
vec2 step(vec2 edge, vec2 x)
vec3 step(vec3 edge, vec3 x)
vec4 step(vec4 edge, vec4 x)
vec2 step(float edge, vec2 x)
vec3 step(float edge, vec3 x)
vec4 step(float edge, vec4 x)

1.
x < edge 返回 0
x >= edge 返回 1
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数为浮点标量第二参数为浮点向量的函数版本
smoothstep-float smoothstep(float edge0, float edge1, float x)
vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x)
vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x)
vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x)
vec2 smoothstep(float edge0, float edge1, vec2 x)
vec3 smoothstep(float edge0, float edge1, vec3 x)
vec4 smoothstep(float edge0, float edge1, vec4 x)

1.
x < edge0 返回 0
x > edge1 返回 1
x >= edge0 并且 x <= edge1 返回 x * x * (3 - 2 * x) (Hermite多项式)
2. 参数类型可以为浮点标量或者浮点向量
3. 存在第一参数及第二参数为浮点标量第三参数为浮点向量的函数版本

几何函数(geometric functions)

函数名说明示例注意点
length长度函数float length(float x)
float length(vec2 x)
float length(vec3 x)
float length(vec4 x)

1. 返回向量长度
2. 参数类型可以为浮点标量或者浮点向量
3. 如果参数为浮点标量,返回 abs(x)
distance距离函数float distance(float p0, float p1)
float distance(vec2 p0, vec2 p1)
float distance(vec3 p0, vec3 p1)
float distance(vec4 p0, vec4 p1)

1. 返回向量间距离,即返回 length(p0 - p1)
2. 参数类型可以为浮点标量或者浮点向量
3. 如果参数为浮点标量,返回 abs(p0 - p1)
dot点积函数float dot(float x, float y)
float dot(vec2 x, vec2 y)
float dot(vec3 x, vec3 y)
float dot(vec4 x, vec4 y)

1. 返回向量点乘结果(标量)
2. 参数类型可以为浮点标量或者浮点向量
3. 如果参数为浮点标量,返回 x * y
cross差积函数vec3 cross(vec3 x, vec3 y)
1. 返回向量差积结果(向量)
2. 参数类型只能为3维浮点向量
normalize归一化函数float normalize(float x)
vec2 normalize(vec2 x)
vec3 normalize(vec3 x)
vec4 normalize(vec4 x)

1. 返回向量归一化结果,即返回 x / length(x)
2. 参数类型可以为浮点标量或者浮点向量
3. 如果参数为浮点标量,返回 1
faceforward-float faceforward(float N, float I, float Nref)
vec2 faceforward(vec2 N, vec2 I, vec2 Nref)
vec3 faceforward(vec3 N, vec3 I, vec3 Nref)
vec4 faceforward(vec4 N, vec4 I, vec4 Nref)

1.
dot(I, Nref) < 0 返回 N
dot(I, Nref) >= 0 返回 -N
2. 参数类型可以为浮点标量或者浮点向量
reflect反射函数float reflect(float I, float N)
vec2 reflect(vec2 I, vec2 N)
vec3 reflect(vec3 I, vec3 N)
vec4 reflect(vec4 I, vec4 N)

1. I 是入射向量(向量方向为从入射点到反射点),N 为反射面法向量(需要归一化)
2. 返回 I - 2.0 * dot(N, I) * N
refract折射函数float refract(float I, float N, float eta)
vec2 refract(vec2 I, vec2 N, float eta)
vec3 refract(vec3 I, vec3 N, float eta)
vec4 refract(vec4 I, vec4 N, float eta)

1. I 是入射向量(向量方向为从入射点到反射点,需要归一化),N 为反射面法向量(需要归一化),eta 为相对折射率(入射介质的折射率 / 折射介质的折射率)
2. 返回值的计算如下所示

k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
if (k < 0.0)R = ReturnType(0) // 不发生折射
elseR = eta * I - (eta * dot(N, I) + sqrt(k)) * N;|

矩阵函数(matrix functions)

函数名说明示例注意点
matrixCompMult-mat2 matrixCompMult(mat2 x, mat2 y)
mat3 matrixCompMult(mat3 x, mat3 y)
mat4 matrixCompMult(mat4 x, mat4 y)
结果矩阵按如下公式计算 z[i][j] = x[i][j] * y[i][j],注意与矩阵乘法的区别

向量关系函数(vector relational functions)

函数名说明示例注意点
lessThan小于函数bvec2 lessThan(vec2 x, vec2 y)
bvec3 lessThan(vec3 x, vec3 y)
bvec4 lessThan(vec4 x, vec4 y)
bvec2 lessThan(ivec2 x, ivec2 y)
bvec3 lessThan(ivec3 x, ivec3 y)
bvec4 lessThan(ivec4 x, ivec4 y)
注意各个函数版本的参数
lessThanEqual小于等于函数bvec2 lessThanEqual(vec2 x, vec2 y)
bvec3 lessThanEqual(vec3 x, vec3 y)
bvec4 lessThanEqual(vec4 x, vec4 y)
bvec2 lessThanEqual(ivec2 x, ivec2 y)
bvec3 lessThanEqual(ivec3 x, ivec3 y)
bvec4 lessThanEqual(ivec4 x, ivec4 y)
注意各个函数版本的参数
greaterThan大于函数bvec2 greaterThan(vec2 x, vec2 y)
bvec3 greaterThan(vec3 x, vec3 y)
bvec4 greaterThan(vec4 x, vec4 y)
bvec2 greaterThan(ivec2 x, ivec2 y)
bvec3 greaterThan(ivec3 x, ivec3 y)
bvec4 greaterThan(ivec4 x, ivec4 y)
注意各个函数版本的参数
greaterThanEqual大于等于函数bvec2 greaterThanEqual(vec2 x, vec2 y)
bvec3 greaterThanEqual(vec3 x, vec3 y)
bvec4 greaterThanEqual(vec4 x, vec4 y)
bvec2 greaterThanEqual(ivec2 x, ivec2 y)
bvec3 greaterThanEqual(ivec3 x, ivec3 y)
bvec4 greaterThanEqual(ivec4 x, ivec4 y)
注意各个函数版本的参数
equal等于函数bvec2 equal(vec2 x, vec2 y)
bvec3 equal(vec3 x, vec3 y)
bvec4 equal(vec4 x, vec4 y)
bvec2 equal(ivec2 x, ivec2 y)
bvec3 equal(ivec3 x, ivec3 y)
bvec4 equal(ivec4 x, ivec4 y)
注意各个函数版本的参数
notEqual不等于函数bvec2 notEqual(vec2 x, vec2 y)
bvec3 notEqual(vec3 x, vec3 y)
bvec4 notEqual(vec4 x, vec4 y)
bvec2 notEqual(ivec2 x, ivec2 y)
bvec3 notEqual(ivec3 x, ivec3 y)
bvec4 notEqual(ivec4 x, ivec4 y)
注意各个函数版本的参数
any-bool any(bvec2 x)
bool any(bvec3 x)
bool any(bvec4 x)
参数的任一分量为true,则返回true,否则返回false
all-bool all(bvec2 x)
bool all(bvec3 x)
bool all(bvec4 x)
参数的所有分量为true,则返回true,否则返回false
not-bvec2 not(bvec2 x)
bvec3 not(bvec3 x)
bvec4 not(bvec4 x)
参数的所有分量取反

贴图采样函数(texture lookup functions)

函数名说明示例注意点
texture2D-vec4 texture2D(sampler2D sampler, vec2 coord)
vec4 texture2D(sampler2D sampler, vec2 coord, float bias)
bias参数用于调整贴图lod的选取采样(在选取的 mipmap level 上做偏移)
textureCube-vec4 textureCube(samplerCube sampler, vec3 coord)
vec4 textureCube(samplerCube sampler, vec3 coord, float bias)
bias参数用于调整贴图lod的选取采样(在选取的 mipmap level 上做偏移)

这篇关于OpenGL ES Shading Language 2.0 参考笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898265

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个