OpenGL ES 内建变量、常量及函数

253 阅读2分钟

顶点着色器内建特殊变量

  • gl_VertexID:输入变量,保存处理的每一个顶点的索引值,一般由高精度修饰
  • gl_InstanceID:实例化时保存当前画的图形的编号
  • gl_Position:最终计算出来的顶点,高精度浮点型四维向量
  • gl_PointSize:每个点的大小
  • gl_FrontFacing:布尔值,表示要不要做face-cutting

顶点着色器内建Uniform

// 深度值的范围
struct gl_DepthRangeParameters
{
  highp float near;//near z
	hightp float far;  //near far
	hightp float diff; //far - near
}

uniform gl_DepthRangeParameters gl_DepthRange;

顶点着色器内建常量

const mediump int gl_MaxVertexAttribs = 16; //最多支持16个顶点同时输入
const mediump int gl_MaxVertexUniformVectors = 256; //最多使用256个uniform
const mediump int gl_MaxVertexOutputVectors = 16; //输出的向量数量最多为16
const mediump int gl_MaxVertexTextureImageUnits = 16; //最多使用16个纹理单元
const mediump int gl_MaxCombinedTextureImageUnits = 32; //在顶点和片元着色器中可用纹理的最大数量总和为32

片元着色器内建特殊变量

  • gl_FragCoord:片元着色器中一个只读变量,这个变量保存片元的窗口相对坐标
  • gl_FrontFacing:片元着色器中的一个只读变量,这个布尔变量在图元为正面是true,否则为false
  • gl_PointCoord:当你创建了一个点精灵,会返回点精灵的位置
  • gl_FragDepth:一个只写的输出变量,在片元着色器写入时,覆盖片元的固定功能深度值,尽量减少手动实现深度值写入,这个功能需要谨慎使用,因为它可能禁用许多GPU的深度优化。例如,许多GPU都有"Early-Z"的功能,在执行片元着色器之前进行深度测试,使用"Early-Z"的好处就是不能通过深度测试的片段就不会被着色(从而降低了着色器调用次数,提高了性能),但是使用gl_FragDepth就必须禁用该功能,因为GPU在执行着色器之前不知道深度值。

片元着色器内建常量

const mediump int gl_MaxFragmentInputVectors = 15;
const mediump int gl_MaxTextureImageUnits = 16;
const mediump int gl_MaxFragmentUniformVectors = 224;
const mediump int gl_MaxDrawBuffers = 4;
const mediump int gl_MinProgramTexelOffset = -8;
const mediump int gl_MaxProgramTexelOffset = 7
  • gl_MaxFragmentInputVectors:片元着色器输入的最大数量
  • gl_MaxFragmentUniformVectors:可用纹理图像单元的最大数量
  • gl_MaxFragmentUniformVectors:片元着色器可用vec4 uniform变量最大数量
  • gl_MaxDrawBuffers:多重渲染目标最大支持数量

常用内建函数

  • dot:点乘
  • cross:叉乘
  • texture2D:用于对纹理采样
  • normalize:对一个向量归一化
  • clamp:将一个向量固定在一个最小值和最大值之间

image.png