WebGL

OpenGL ES GLSL与自定义着色器API

2020-07-29  本文已影响0人  源本平凡

EGL(Embedded Graphics Library)

主要功能

GLSL语言

  • 使用vsh、fsh后缀的原因是方便区分着色器,其本质就是一个字符串(也可以使用其他后缀)
  • 不建议在这两个文件中直接使用NSString,因为这样子会使代码结构不清晰,且不易读
  • 不建议在这两个文件中加中文注释,因为可能会报奇怪的错误。由于在xcode中书写GLSL,完全是纯手写,没有任何提示,排查问题不好排查

数据类型及相关API

向量数据类型

常用的是vec2、vec3、vec4,默认是浮点类型

类型 描述
vec2, vec3, vec4 2分量、3分量、4分量浮点向量
ivec2, ivec3, ivec4 2分量、3分量、4分量整型向量
uvec2, uvec3, uvec4 2分量、3分量、4分量无符号整型向量
bvec2, bvec3, bvec4 2分量、3分量、4分量bool型向量

矩阵数据类型

最常用的是mat3、mat4

类型(mat列×行) 描述
mat2,mat2x2 两⾏两列
mat3,mat3x3 三行三列
mat4,mat4x4 四行四列
mat2x3 三行两列
mat2x4 四行两列
mat3x2 两行三列
mat3x4 四行三列
mat4x2 两行四列
mat4x3 三行四列

变量存储限定符

常用varying、attribute、uniform

attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;

void main()
{
    varyTextCoord = textCoordinate;
    gl_Position = position;
}
//需要定义精度,否则可能会报错
precsion highp float;
//纹理坐标 必须与顶点着色器中一模一样,通过这个参数获取传递过来的值
varying lowp vec2 varyTextCoord;
//纹理 
uniform sampler2D colorMap;   

void main(){
    //1、拿到纹理对应坐标下的纹素。纹素是纹理对应像素点的颜色值
    lowp vec4 temp = texture2D(colorMap, varyTextCoord);
    
    //2、非常重要且必须的内建变量:gl_FragColor
    gl_FragColor = temp;
} 
限定符 描述
<none> 只是普通的本地变量,外部不见,外部不可访问
const ⼀个编译常量,或者说是⼀个对函数来说为只读的参数
in/varying 从以前阶段传递过来的变量
in/varying centroid ⼀个从以前的阶段传递过来的变量,使⽤质⼼插值
out/attribute 传递到下⼀个处理阶段或者在⼀个函数中指定⼀个返回值
out/attribute centroid 传递到下⼀个处理阶段,质心插值
uniform ⼀个从客户端代码传递过来的变量,在顶点之间不做改变

OpenGL ES 错误处理

如果不正确使用OpenGL ES 命令,应用程序就会产生一个错误编码,且会被记录,可以用glGetError查询,一旦查询到错误代码,当前的错误代码就会复位为GL_NO_ERROR

错误代码 描述
GL_NO_ERROR 从上⼀次调⽤glGetError 以来没有生成任何错误
GL_INVALID_ENUM GLenum 参数超出范围,忽略生成错误命令
GL_INVALID_VALUE 数值型 参数超出范围,忽略生成错误命令
GL_INVALID_OPERATION 特定命令在当前OpenGL ES 状态⽆法执⾏
GL_OUT_OF_MEMORY 内存不足时执⾏该命令,如果遇到这个错误,除⾮当前错误代码,否则OpenGL ES 管线的 状态被认为未定义

OpenGL ES 自定义着色器常用API

自定义着色器一般有以下步骤:

以下是创建与编译一个着色器的相关API


着色器API.png

自定义程序

自定义程序一般有以下步骤:

以下是创建与链接程序的相关API


创建与链接程序的相关API.png
上一篇下一篇

猜你喜欢

热点阅读