顶点着色器的优化: Vertex Shader - MartinRGB/GLES30_ProgrammingGuide_NDK GitHub Wiki

构建顶点着色器的一些要点

顶点着色器内建特殊变量

gl_VertexID 保存顶点的整数索引

gl_InstanceID 实例化绘图中,图元的实例编号

gl_Position 输出顶点位置的裁剪坐标

gl_PointSize 点的像素尺寸

顶点着色器内建 unifrom

其中唯一可用的内建 unifrom 状态是窗口坐标中的深度范围,由 gl_DepthRange 给出

  struct gl_DepthRangeParameters
  {
    highp float near; //near Z
    highp float far;  //far Z
    highp float diff; //far - near
  }

  uniform gl_DepthRangeParameters gl_DepthRange;

顶点着色器中使用默认精度

  precision highp float;
  precision mediump int;

则该类型全部使用对应精度

顶点着色器的常数变量使用

应该声明相应的常数变量代替字面值,减少一个字面值计算多次

例如:

  v_texcoord[0] = vec4(0.0,0.0,0.0,1.0);
  ...
  v_texcoord[1] = vec4(1.0,0.0,0.0,1.0);

这段代码可能导致对字面值 1,0,0.0,1.0 每次引用都被计入 unifrom 存储,应该替换成:

  const int c_zero = 0;
  const int c_one = 1;
  ...
  v_texcoord[c_zero] = vec4(float(c_zero),float(c_zero),float(c_zero),float(c_one));
  ...
  v_texcoord[c_one] = vec4(float(c_one),float(c_zero),float(c_zero),float(c_one));
  

C 语言基础知识补充

-> :

   //定义结构体指针,将 userData 中的值赋给 esContext
   UserData *userData = esContext->userData;

...

   //首先 a->b 的含義是 (*a).b  ,也就是 (*userData).programObject
   userData->programObject = esLoadProgram ( vShaderStr, fShaderStr );

& :

   //&projection 指针指向 projection 的地址
   esMatrixLoadIdentity ( &projection );
   esPerspective ( &projection, 60.0f, aspect, 1.0f, 20.0f );