顶点着色器的优化: 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 );