天天看點

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

3.3點

點的光栅化由下兩個函數控制:

Void  PointSize(float  size);

Void  PointSizex(fixed  size);

Size定義了點的尺寸。預設值是1.0。一個小于或等于0的值會導緻錯誤INVALID_VALUE。

點的尺寸會乘上一個距離衰減因子,固定于由PointParameter定義的尺寸範圍,參看下面叙述,更固定于依賴執行的點範圍去推導出衍生的點尺寸:

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

這裡d是眼坐标中眼和頂點坐标的距離,(0,0,0,1)是眼的坐标,a、b和c是距離衰減函數系數。

點精靈的“能”或“不能”是通過調用POINT_SPRITE_OES符号常量的Enable或Disable設定。點精靈狀态的預設值是“不能”。當點精靈是不能時,點的抗鋸齒狀态是被忽略的。

點精靈的紋理坐标的複位模式由以下指令設定

Void  TexEnv{ixf}(enum  target, enum  pname, T  param);

Void  TexEnv{ixf}(enum  target, enum  pname, T  params);

Target的值是POINT_SPRITE_OES而且pname是COORD_REPLACE_OES。param可能的值是FALSE和TRUE。點精靈的紋理坐标複位的各紋理單元的預設值是disabled。

如果重采樣不是enable,源尺寸被當做點寬度傳給光栅。

如果重采樣是enable,一個執行将随機的淡化點的alpha(參看3.10)值,以取代允許點寬度gobelow給定的極值。在那種情況下,光栅化的點的寬度為:

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

淡化因子按如下方法計算:

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

距離衰減函數的系數a,b和c,第一個點的尺寸範圍,點的淡化極限,由以下函數定義:

Void PointParameter{xf}(enum pname, T  param);

Void PointParameter{xf}v(enum pname,const  T  params);

如果pname是POINT_SIZE_MIN或者POINT_SIZE_MAX,那麼param或者params各自指定了更低或者更高的源點尺寸固定的範圍。如果更低的範圍比更高的範圍更大,點尺寸固定值之後的值沒有定義。如果pname的值是POINT_DISTANCE_ATTENUATION,那麼params指向了參數a,b,c。如果pname是POINT_FADE_THRESHOLD_SIZE,那麼param定義的或者params指向的是點的淡出極限。POINT_SIZE_MIN值、POINT_SIZE_MAX值和POINT_FADE_THRESHOLD_SIZE值低于0會導緻INVALID_VALUE錯誤。

點抗鋸齒的“能”或“不能”是通過調用POINT_SMOOTH符号常量的Enable或Disable設定。點抗鋸齒狀态的預設值是“不能”。

3.3.1點光栅化基礎

在預設狀态,點的光栅化是裁剪它的xw和yw坐标(注意,下标表明這是x和y的視窗坐标)到整數。這個(x,y)的位址,随同與點相應的頂點相關聯的資料生成的資料,被作為單個的片元被傳遞到GL的片元舞台。

寬度不為1.0的點的效果依賴于點抗鋸齒和點精靈的狀态。

不抗鋸齒的點

如果抗鋸齒和點精靈都為disable,真實的寬度通過将寬度取整到最近的整數來決定,然後固定到依賴于執行的最大的不抗鋸齒的寬度。這個依賴于執行的值必須不小于依賴于執行的最大的抗鋸齒點寬,取整到最近的整數值,并且無論如何都不低于1。如果對指定寬度取整得到0值,将會将之置為1。如果結果寬度為基數,那麼點

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

是由頂點的xw和yw計算出的,并且基數寬度的方形栅格在(x,y)的中心定義了光栅片元的中心(注意,片元中心取值為半整數的視窗坐标值)。如果寬度是偶數,那麼中心點是

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

光栅化片元中心是半整數的視窗坐标值,在偶數寬度中心的方形中,在(x,y)。參看圖3.2。

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

圖3.2不抗鋸齒點的光栅化。叉代表陰影區域中的點背光栅化後産生的片元中心。虛線代表半整型坐标。

所有的片元都是通過光栅化一個不抗鋸齒的點而生産的,它們被分派了相同的關聯資料,這些資料是伴随點的頂點,分别用紋理坐标s,t和r來取代s/q,t/q,和r/q。如果q小于等于0,那麼結果是未定義的。

抗鋸齒的點

如果抗鋸齒的值是enable,并且點精靈的值是disable,那麼點光栅化為每個片元區域生産一個片元。片元區域是網格線和目前點的邊界圓的交點決定的(圖3.3)。每個片元的覆寫值是圓區域和相應的片元區域的交叉點的視窗坐标區域(參看3.2)。這個值被儲存起來并在光栅化的最後一步使用(參看3.9)。其它相關的片中繼資料都和不抗鋸齒點一樣的方式得到。

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

圖3.3.抗鋸齒點的光栅化。黑點代表被光栅化的點。陰影區域定義了寬度。X标記代表了光栅化後生成的片元中心。一個片元計算出的覆寫值是基于覆寫相應的片元區域的陰影區域的部分。實作代表整型坐标。

點抗鋸齒的時候并不是所有的寬度都需要被支援,但1.0的寬度必須被支援。如果需要對一個不支援的寬度做抗鋸齒,那麼需要用最近鄰的支援的寬度來代替。支援的寬度範圍在這個範圍裡以均勻間距漸變的寬度都是依賴于執行的。範圍和漸變可以通過第6章介紹的查詢機制來獲得。例如,如果寬度範圍是0.1到2.0,而且漸變寬度是0.1,那麼寬度0.1,0.2,…,1.9,2.0都是支援的。

點精靈

當點精靈是enable,那麼點的光栅化為每個幀緩存像素生成一個片元,片元的中心在一個以(xw,yw)點為中心的方形區域中,區域的邊長等于目前點的尺寸。

各片元的相應的資料的決定方式和不抗鋸齒是一樣的。盡管如此,對于COORD_REPLACE_OES是TRUE的各個紋理單元,紋理坐标都被點精靈的紋理坐标代替。s坐标從0到1的穿過點變化,水準的從左到右,t坐标從0到1變化,垂直的從頂到底。r和q坐标各自被常量0和1代替。

下面的公式用來計算s和t的坐标:

點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)
點基礎知識——OpenGL ES Common/Common-Lite 規範(版本 1.1.12)

size是點的尺寸,xf和yf是整型的片元視窗坐标,xw和yw是精确的、非圓形的頂點視窗坐标。

點精靈的寬度支援必須是支援抗鋸齒點的超集。不需要證明,這些寬度必須是相等的空間。如果一個不支援的寬度,它最近鄰的支援寬度将會用來替代它。

3.3.2點光栅化狀态

該狀态需要控制由浮點值定義的點寬度組成的點光栅化,三個浮點值定義了最小、最大點尺寸和點的淡出的起始值,三個浮點值定義了距離衰減系數,一個位指定是否抗鋸齒,一個位指定是否使用點精靈,一個位用于各個紋理單元的點精靈紋理坐标替代模式。

3.3.3點多重采樣光栅化

如果MULTISAMPLE為enable,并且SAMPLE_BUFFERS的值是1,那麼點利用如下算法來光栅化,不管點抗鋸齒(POINT_SMOOTH)是enable或disable。點光栅化利用一個或多個樣本點與中心在點(xw,yw)的區域為每個幀像素生成一個片元。這個區域是一個圓,當POINT_SPRITE_OES是disable時與目前點有同樣的直徑,當POINT_SPRITE_OES是enabled時區域的邊長與目前點的寬度一樣。與樣本點相應的覆寫值與區域的交叉為1,其它的覆寫值是0。所有和各片元樣本相應的資料都是相應的點被光栅化得到的,除了當POINT_SPRITE_OES是enabled時的紋理坐标;這些紋理坐标的計算在3.3節中描述過了。

當POINT_SPRITE_OES是disabled時,點尺寸範圍和漸變數量和這些被支援的抗鋸齒點是等價的。當POINT_SPRITE_OES是enabled時,被設定的支援的尺寸和沒有多重采樣的點精靈是等價的。

http://www.moandroid.com/?p=1033