SurfaceView

《OpenGL从入门到放弃05》着色器语言

2019-04-27  本文已影响0人  蓝师傅_Android

之前文章:

《OpenGL从入门到放弃01 》一些基本概念
《OpenGL从入门到放弃02 》GLSurfaceView和Renderer
《OpenGL从入门到放弃03 》相机和视图
《OpenGL从入门到放弃04 》画一个长方形

通过前面几篇文章,相信大家已经掌握了使用OpenGL绘制三角形和长方形,还有一些看起来复杂一点的圆柱、圆锥,就不再介绍了,大家有兴趣的话自己去发挥一些。
有疑问的点应该是着色器语言,所以有了这篇文章。

着色器语言

数据类型

GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型:

变量声明示例:

float a=1.0;
int b=1;
bool c=true;
vec2 d=vec2(1.0,2.0);
vec3 e=vec3(1.0,2.0,3.0)
vec4 f=vec4(vec3,1.2);
vec4 g=vec4(0.2);  //相当于vec(0.2,0.2,0.2,0.2)
vec4 h=vec4(a,a,1.3,a);
mat2 i=mat2(0.1,0.5,1.2,2.4);
mat2 j=mat2(0.8);   //相当于mat2(0.8,0.8,0.8,0.8)
mat3 k=mat3(e,e,1.2,1.6,1.8);

运算符

GLSL中的运算符有(越靠前,运算优先级越高):

  1. 索引:[]
  2. 前缀自加和自减:++,–
  3. 一元非和逻辑非:~,!
  4. 加法和减法:+,-
  5. 等于和不等于:==,!=
  6. 逻辑异或:^^
  7. 三元运算符号,选择:?:
  8. 成员选择与混合:.
  9. 后缀自加和自减:++,–
  10. 乘法和除法:*,/
  11. 关系运算符:>,<,=,>=,<=,<>
  12. 逻辑与:&&
  13. 逻辑或:||
  14. 赋值预算:=,+=,-=,*=,/=

基本和其它语言一致。

限定符

attritude:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。
uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。
const:常量。
看下例子:

    // 顶点着色器的脚本
    String vertexShaderCode =
                    "uniform mat4 uMVPMatrix;" +    /接收传入的转换矩阵
                    "attribute vec4 vPosition;" +      //接收传入的顶点
                    "attribute vec2 aTexCoord;" +       //接收传入的顶点纹理位置
                    "varying vec2 vTextureCoord;" +     //增加用于传递给片元着色器的纹理位置变量
                    "void main() {" +
                        "gl_Position = uMVPMatrix * vPosition;" +  //矩阵变换计算之后的位置
                        "vTextureCoord = aTexCoord;" +
                    " }";

浮点精度

与顶点着色器不同的是,在片元着色器中使用浮点型时,必须指定浮点类型的精度,否则编译会报错。精度有三种,分别为:

lowp:低精度。8位。
mediump:中精度。10位。
highp:高精度。16位。

不仅仅是float可以制定精度,其他(除了bool相关)类型也同样可以,但是int、采样器类型并不一定要求指定精度。加精度的定义如下:

uniform lowp float a=1.0;
varying mediump vec4 c;

也可以直接在片元着色器第一行声明

precision mediump float;  // 声明float类型的精度为中等(精度越高越耗资源)

内建变量

顶点着色器的内建变量

输入变量

  1. gl_Position:顶点坐标
    在上面代码段可以看到,直接使用gl_Position,不需要定义或者声明,
  2. gl_PointSize:点的大小,没有赋值则为默认值1,通常设置绘图为点绘制才有意义。

片元着色器的内建变量

输入变量

  1. gl_FragCoord:当前片元相对窗口位置所处的坐标。
  2. gl_FragFacing:bool型,表示是否为属于光栅化生成此片元的对应图元的正面。

加粗是我们常用的内建变量

输出变量

  1. gl_FragColor:当前片元颜色
  2. gl_FragData:vec4类型的数组。向其写入的信息,供渲染管线的后继过程使用。

函数

常见函数

函数目前基本没怎么用到过,所以没有加粗,后面用到再回来查一下即可

几何函数

ps:distance 函数在后面做滤镜的时候可能会用到

矩阵函数

纹理采样函数

texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样
Lod后缀,只适用于顶点着色器采样 Proj表示纹理坐标st会除以q

texture2D 有2个参数, 第一个参数表示纹理采样器,(纹理采样器是片元着色器的内置变量)。 第二个参数表示纹理坐标,可以是二维、三维、或者四维(我们需要把纹理坐标传过去)

认真阅读,可以发现着色器语言并不复杂,我们只要掌握几个常用的,然后其他等需要的时候再查一下即可。

下一篇开始我们将学习比较有意思的纹理和图片处理,敬请期待吧!

上一篇 下一篇

猜你喜欢

热点阅读