15.1 OpenGL可编程片段处理:片段着色器变量

片段着色器变量 Fragment Shader Variables

在OpenGL着色语言(GLSL)中,片段着色器(Fragment Shader)具有以下功能和访问权限:

  1. 访问当前程序对象的 uniforms:片段着色器可以读取当前关联的程序对象中的uniform变量。这些全局变量用于传递不随顶点变化的数据,如光照参数、变换矩阵等,其存储限制及操作方法在第7.6节中有详细描述。

  2. 使用纹理采样器:片段着色器能够通过samplers执行纹理采样操作,以获取纹理图像的颜色或其它数据。这部分内容在第7.11节中阐述。

  3. 读取输入变量:片段着色器可以读取与光栅化生成片段属性相对应的输入变量。GLSL定义了一组内建输入(built-in inputs),包括片段的位置信息以及其他相关数据。

  4. 接收前一阶段输出:前一个活跃的着色器阶段(通常是顶点着色器)定义的输出变量,在进行插值后可供片段着色器使用。如果未采用平坦着色(flat shading),则这些变量会在渲染的图元内部进行线性插值。

  5. 插值控制:默认情况下,输入变量在屏幕空间内的采样位置由光栅化阶段确定,并可通过插值限定符(如centroid in 和 sample in)来覆盖默认行为。当声明为centroid in时,变量将在像素中心附近的位置采样;启用MULTISAMPLE时,声明为sample in的变量会针对每个覆盖的样本独立调用片段着色器并在相应样本点上采样。

  6. 内建函数实现精细插值:GLSL提供了一系列内建函数,如interpolateAtCentroidinterpolateAtSampleinterpolateAtOffset,允许更精确地控制插值过程。interpolateAtOffset可以让开发者指定(x, y)偏移量相对于像素中心的采样位置,但该偏移量必须在实现依赖的MIN_FRAGMENT_INTERPOLATION_OFFSET和MAX_FRAGMENT_INTERPOLATION_OFFSET之间,否则结果将是未定义的。

  7. 写入输出变量:片段着色器还可以向输出变量写入数据,这些数据将被用于后续的每片段操作中。片段着色器输出的浮点数、整数或无符号整数可用于写入帧缓冲区对象绑定的缓冲区,或者写入默认帧缓冲区的颜色缓冲区。如何将这些输出导向特定缓冲区的操作在第15.2.3节有详细介绍。

你可能感兴趣的:(OpenGL,图形渲染)