14.4 OpenGL图元装配和光栅化:点

点 Points

在OpenGL中,点的绘制通过生成一组围绕顶点的方形或圆形片段实现。

每个顶点关联一个点大小属性,控制该点所呈现形状的大小。如果启用了程序点大小模式(通过Enable(GL_PROGRAM_POINT_SIZE)),则从最后一个顶点处理阶段输出(可能被裁剪过的)内置变量gl_PointSize获取点的实际大小,并将其限制在实现相关的点大小范围内。若gl_PointSize写入的值小于等于零或者未写入值,则结果未定义。

当禁用程序点大小模式时,可使用PointSize(float size)函数指定点的大小,默认值为1.0。

如果启用了多重采样,实现可能会选择对点的alpha通道进行淡化而不是让点宽低于某个阈值。在这种情况下,光栅化的点宽度根据给定公式计算,并且会有一个淡化系数(fade factor)。

  • width = ( derived_size ≥ threshold ) ? derived_size : threshold;
  • fade = ( derived_size ≥ threshold ) ? 1:power(derived_size / threshold, 2);

点淡化阈值(threshold)可通过调用PointParameter*函数并设置pnamePOINT_FADE_THRESHOLD_SIZE来指定。

此外,点精灵纹理坐标的原点可以通过PointParameter*命令设置,其中pnamePOINT_SPRITE_COORD_ORIGIN,param可以是LOWER_LEFTUPPER_LEFT,默认值为UPPER_LEFT。这样可以控制点精灵上纹理坐标的定位方式。

void glPointSize( float size );
  • 以像素为单位,设置渲染点的大小。
void glPointParameter{if}( enum pname, T param );
void glPointParameter{if}v( enum pname, const T *params );
  • 设置点参数(POINT_FADE_THRESHOLD_SIZE、POINT_SPRITE_COORD_ORIGIN)。

基本点的光栅化 Basic Point Rasterization

  • 当一个点进行光栅化时,它会以点坐标(x, y)为中心,边长等于GL_POINT_SIZE的正方形区域内,为每个像素生成片段(fragment)。
  • 对于点精灵的纹理贴图,内置的片段着色器变量gl_PointCoord提供了在点精灵正方形区域内的标准化纹理坐标(s 和 t)。
  • 计算这些纹理坐标 s 和 t 的公式取决于通过POINT_SPRITE_COORD_ORIGIN指定的原点,其可以是LOWER_LEFTUPPER_LEFT
    • 如果是LOWER_LEFT,s从左到右从0到1水平变化,t从下到上从0到1垂直变化。
    • 如果是UPPER_LEFT,s从左到右从0到1水平变化,t从上到下从0到1垂直变化。
  • 实现并不需要支持所有可能的点大小,但必须提供宽度为1.0的支持。
  • 如果请求的宽度不受支持,则使用最接近的支持宽度替代。

点光栅化的状态 Point Rasterization State

  • 浮点类型的点宽度(Point Width);
  • 顶点程序点大小模式(Vertex Program Point Size Mode);
  • 点精灵纹理坐标原点(Point Sprite Texture Coordinate Origin);
  • 浮点类型的点淡化阈值大小(Point Fade Threshold Size);

点的多重采样光栅化 Point Multisample Rasterization

MULTISAMPLE模式被启用,并且帧缓冲区的SAMPLE_BUFFERS值为1时,表明系统支持多重采样。在这种情况下,点的光栅化过程会发生变化:

  • 点的光栅化不再简单地对应于单个像素,而是对每个与点中心区域相交的帧缓冲区像素的所有采样点生成片段(fragment)。这个中心区域是一个边长等于当前点宽度的正方形。
  • 如果某个采样点位于这个正方形区域内,则对应的覆盖位(coverage bit)会被置为1,否则为0。这意味着对于一个像素内的多个子采样点,如果它们与点的边界有交集,那么该像素将被部分或全部覆盖。
  • 与这些样本点相关的所有数据(例如颜色、深度、纹理坐标等)都取自正在被光栅化的那个点的数据,而不是根据样本位置进行插值。
  • 尽管采用了多重采样,但支持的点尺寸集合与不使用多重采样的点精灵(Point Sprites)相同。也就是说,即使在多采样环境下,点的大小仍然受到同样范围的支持和限制。

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