音视频从入门到放弃openGL ES

GLSL语言OpenGLES(二)

2019-06-08  本文已影响0人  仙人掌__

前言

opengl es通过顶点着色器程序和片段着色器程序来实现可编程的渲染,着色器程序也有自己的编程语言简称为GLSL,GLSL语言和C语言比较类似,接下来就是对GLSL语言特性的记录。

GLSL(着色器编程语言)

// this is a comment
/**
  *   this is muti comment
*/

备注:GLSL语言必须由ASCII码字符组成,如果包括非ascii码编译会出错

#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
#error
#pragma
#extension
#version
#line
#pragma
// 编译指示。用来控制编译器的一些行为,开发和调试时可以设置为off,默认设为on。
#pragma optimize(on)
#pragma optimize(off)
// 开发和调试时可以打开debug选项,以便获取更多的调试信息。默认设为off。
#pragma debug(on)
#pragma debug(off)
#extension
// 如果想使用GLGL默认不支持的操作,则必须启用对应的扩展,启用一个扩展可以使用下面的命令:
#extension : behavior
#extension all : behavior
其中,extension_name是扩展的名称,all是指所有的编译器支持的扩展。
behavior是指对该扩展的具体操作。比如启用、禁用等等。详情如下:
behavior                       作用                             
require                         启用该扩展。如果不支持,则报错。
enable                          启用该扩展。如果不支持,则会警告。extension_name是all的时候会报错。
warn                            启用该扩展。但是会检测到所有使用该扩展的地方,提出警告。
disable                         禁用该扩展。如果该扩展不被支持,则提出警告。
attribute const uniform varying
break continue do for while
if else
in out inout
float int void bool true false
lowp mediump highp precision invariant
discard return
mat2 mat3 mat4
vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4
sampler2D samplerCube
struct

asm
class union enum typedef template this packed
goto switch default
inline noinline volatile public static extern external interface flat
long short double half fixed unsigned superp
input output
hvec2 hvec3 hvec4 dvec2 dvec3 dvec4 fvec2 fvec3 fvec4
sampler1D sampler3D
sampler1DShadow sampler2DShadow
sampler2DRect sampler3DRect sampler2DRectShadow
sizeof cast
namespace using

除此之外,所有的以__开头的变量全部是预留的,自定义的变量不能以__开头。

精度限定符

先看如下片段着色器的GLSL代码

uniform sampler2D colorMap;
varying lowp vec2 varyingCoordPos;
void main() {
    vec4 color = texture2D(colorMap,varyingCoordPos);
    gl_FragColor = color;
}

这段代码编译时会提示"declaration must include a precision qualifier for type",意思就是声明变量时没有指定精度限定符

precision highp float;

代表之后所有和float有关的没有精度限定符修饰的变量的精度都为float

GLSL中矩阵和向量相关运算

引用GLSL官方文档中的例子,这里以三维向量和三维矩阵为例,二维和四维类似

向量与单个变量相加,将向量中的每个元素分别于这个变量相加,结果仍然为向量,且不区分向量和单个变量的顺序即:
vec3 v, u;
float f;

v = u + f;
等价于
v.x = u.x + f;
v.y = u.y + f;
v.z = u.z + f;

v = f + u;
等价于
v.x = f + u.x;
v.y = f + u.y;
v.z = f + u.z;
备注:向量与单个变量的乘法一样。减法和除法则可以换成等价的加法和乘法

两个向量相加,分别将两个向量对应位置的元素相加,结果仍然为向量,且不区分向量和单个变量的顺序即:
vec3 v, u, w;

w = v + u;
等价于
w.x = v.x + u.x;
w.y = v.y + u.y;
w.z = v.z + u.z;
乘法一样

向量乘以矩阵,分别将向量与矩阵的每一列相乘,结果为行向量(这里向量只有一行)
vec3 v, u;
mat3 m;
u = v * m;
等价于
u.x = v.x * m[0].x + v.y * m[0].y + v.z * m[0].z;
u.y = v.x * m[1].x + v.y * m[1].y + v.z * m[1].z;
u.z = v.x * m[2].x + v.y * m[2].y + v.z * m[2].z;

矩阵乘以向量,分别矩阵的每一行与向量相乘,结果为列向量(这里向量只有一列)
vec3 v, u;
mat3 m;
u = m * v;
等价于
u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z;
u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z;
u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;

这里与例子3的区别就是它的最终结果变成了列向量

上一篇 下一篇

猜你喜欢

热点阅读