OpenGL ES 3.0编程指南:第七章. Primitive Assembly and Rasterization---(一)

[TOC]

摘要

本章描述了OpenGL ES支持的图元类型和几何对象,并且解释了如何绘制它们。然后描述了图元装配阶段,它发生在顶点shader处理完图元的顶点之后。在图元装配阶段,详细介绍了裁剪、透视分割和视口变换操作。然后描述了光栅化阶段的操作,光栅化是将图元转化为一组二维片段的操作,这些片段由片段shader进行处理,代表可以在屏幕上绘制的像素。

1. Primitives

一个图元是指可以用glDrawArrays, glDrawElements, glDrawRangeElements, glDrawArraysInstanced, glDrawElementsInstanced来绘制的几何对象。图元可以用一组表示顶点位置的顶点来描述。

在OpenGL ES 3.0中可以绘制下列图元:

  • Triangels
  • Lines
  • Point sprites

Triangles


OpenGl ES支持的画三角形有三种:GL_TRIANGLES、GL_TRANGLE_STRIP 和 GL_TRIANGLE_FAN

  • GL_TRANGLES: 画一系列单独的三角形,如果有 n 个顶点,那么就会画 n/3 个三角形,如上图中(v0, v1, v2) and (v3, v4, v5)

  • GL_TRANGLE_STRIP: 画一系列相连的三角形,如果有n个顶点,那么就会画 n - 2 个三角形,如上图中(v0, v1, v2), (v2, v1, v3) and (v2, v3, v4)

  • GL_TRANGLE_FAN: 画一系列相连的三角形,如果有n个顶点,那么就会画 n - 2 个三角形,如上图中 (v0, v1, v2), (v0, v2, v3), and (v0, v3, v4)

Lines

OpenGL ES 3.0编程指南:第七章. Primitive Assembly and Rasterization---(一)_第1张图片

OpenGl ES支持的画线方法有三种:GL_LINE, GL_LINE_STRIP, GL_LINE_LOOP

  • GL_LINES: 画一系列不相连的线,如果有 n 个顶点,那么就会画 n/2 个线段,如上图中 (v0, v1), (v2, v3), and (v4, v5)

  • GL_LINE_STRIP: 画一系列相连的线,如果有 n 个顶点,那么就会画 n - 1 个线段,如上图中 (v0, v1), (vl, v2), and (v2, v3)

  • GL_LINE_LOOP: 画一系列相连的线,如果有 n 个顶点,那么就会画 n 个线段,如上图中 (v0, v1), (v1, v2), (v2, v3), (v3, v4), and (v4, v0)

可以指定线段的宽度:

void glLineWidth (GLfloat width)

  • width : 线的宽度,默认值是1.0
  • 指定的线的宽度会受限于OpenGL ES具体实现所支持的线宽范围。此外,线的宽度将被OpenGL记住,直到由应用程序更新。

OpenGL ES所支持的线宽范围可以查询:

GLfloat lineWidthRange[2];
glGetFloatv (GL_ALIASED_LINE_WIDTH_RANGE, lineWidthRange);

对于大于1的线宽,OpenGL并没有要求去支持(也就是说,具体实现支不支持大于1的线宽都是可以的)。

Point Sprites

OpenGL ES支持的点精灵类型是 GL_POINTS。点精灵对每个指定的顶点进行绘制。点精灵通常用于将粒子效果当做点而非正方形绘制,从而实现高效渲染。点精灵是指定位置和半径的屏幕对齐的正方形,位置表示正方形的中心,半径用于计算描述点精灵的正方形的四个坐标。

gl_PointSize是顶点shader中用来输出点半径的内置变量。使用点精灵图元的顶点shader如果没有指定gl_PointSize的值,那么点的半径值就是未定义的,从而引发错误。gl_PointSize的值受到具体实现所支持的范围限制,这个范围可以查询:

GLfloat pointSizeRange[2];
glGetFloatv (GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange);

默认情况下, OpenGL ES的窗口原点(0,0)是指左下点,但是对于点精灵,点坐标的原点是左上点。

gl_PointCoord是当图元为点精灵时在片段shader中的内置变量,它是一个精度为medium的vec2变量,取值范围是(0.0 ~ 1.0),可以用作纹理坐标。

#version 300 es
precisioin mediump float;
uniform sampler2D s_texSprite;
layout (location = 0) out vec4 outColor;

void main()
{
    outColor = texture(s_texSprite, gl_PointCoord);
}

你可能感兴趣的:(OpenGL ES 3.0编程指南:第七章. Primitive Assembly and Rasterization---(一))