AGG第二十五課pixelformatrenderers像素格式渲染器-創(chuàng)新互聯(lián)

1 聲明

看看這個聲明:

創(chuàng)新互聯(lián)長期為超過千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為信豐企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,信豐網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

agg::pixfmt_rgb24 pixf(rbuf);

這里我們創(chuàng)建了一個底層的像素渲染對象(pixel renderingobject)并將它附著到渲染內(nèi)存區(qū)(renderingbuffer)上,它是這樣定義的:

typedef pixel_formats_rgb24<order_rgb24>pixfmt_rgb24;

類模板 pixel_formats_rgb24 掌握了內(nèi)存中具體的像素格式信息。唯一的模板參數(shù)可以是 order_rgb24 或是 order_rgb23,它們定義了顏色字節(jié)(color channels)的順序。

與 rendering buffer 不同的是,這些類使用整型的像素坐標(biāo)進(jìn)行操作,因?yàn)樗鼈冎涝趺从?jì)算對于特定點(diǎn) X 的偏移。你可能會說,如果在 rendering buffer 中保存像素的寬度值的話會更容易,但是在實(shí)踐中會有很多限制。別忘了,像素寬度可能比一個字節(jié)還小,比如在打印機(jī)渲染高解析度的 B&W 圖像的時候就是這樣。因此,我們需要將這個功能分離出來,rendering_buffer 這個類就用于加速對“行”的訪問,而 pixelformat renderers 就負(fù)責(zé)如何解析“行”是什么。

pixel_formats_rgb24(rendering_buffer&rb);

像素格式渲染器(pixecl formatrenderers)的構(gòu)造函數(shù)需要一已經(jīng)創(chuàng)建并良好初始化的rendering_buffer對象的引用。這個構(gòu)建工作的開銷很小,基本上只是初始化一個指針。

Member Functions

像素格式渲染器(pixecl formatrenderers)必須要實(shí)現(xiàn)以下這些接口:

unsigned width() const { return m_rbuf->width(); }

unsigned height() const { returnm_rbuf->height(); }

返回內(nèi)存區(qū)的寬和高(以像素?cái)?shù)來衡量)

color_type pixel(int x, int y);

返回(x,y)坐標(biāo)處的像素的顏色

void copy_pixel(int x, int y, constcolor_type& c);

將帶顏色的像素拷入緩存區(qū)中。如果是本身 RGB 像素格式,那么它就不考慮 rgba8 拷貝源中的存在的 alpha 通道。如果本身是 RGBA,那么它就簡單地把所有值都拷貝過來,包括 R、G、B,以及 alpha 通道值。

void blend_pixel(int x, int y, constcolor_type& c, int8ucover);

這個函數(shù)將帶顏色信息的像素 c 與緩存區(qū)(x,y)處的像素進(jìn)行混合(blending)?,F(xiàn)在我們來解釋一下“混合”的概念。混合(blending)是抗鋸齒(anti-aliasing)的關(guān)鍵特性。在 RGBA 的顏色空間中,我們使用 rgba8 結(jié)構(gòu)體來代表顏色。這個結(jié)構(gòu)體有一個數(shù)據(jù)成員int8u a ,它就是 alpha 通道。不過,在這個函數(shù)里,我們還看到一個參數(shù) cover ,表示像素的覆蓋值大小,比如,這個像素被多邊形所“覆蓋”的部分的大?。ㄗg注:這涉及到亞像素精度,因?yàn)橐粋€像素可以分為 256*256 份,所以這個像素并不一定全部被“覆蓋”,詳細(xì)可參考AGG 對于亞像素的說明)。其實(shí)你可以把它看成是另一個 alpha(或者應(yīng)該叫它Beta?:))。這么做有兩個原因,首先,顏色類型(color type)不一定非要包含 alpha 值)。就算顏色類型帶有 alpha 值,它的類型也不一定非要與抗鋸齒算法中使用的顏色類型一致。假設(shè)你現(xiàn)在使用的是 "Hi-End" RGBA 顏色空間,這種顏色空間使用4個取值范圍是[0,1]浮點(diǎn)型來表示,alpha通道值也使用浮點(diǎn)數(shù)————對于這種情況來說,混合時使用一個byte實(shí)在太少了,但在去鋸齒時卻非常夠用。所以,cover 值就是為去鋸齒而使用的一個統(tǒng)一的備用 alpha 值。在大部分情況來說,用 cover_type 來定義它,但在光柵化處理器(rasterizers)中是直接顯示地使用 int8u 類型的。這是故意這么定義的,因?yàn)槿绻枰訌?qiáng) cover_type 的能力時,會使得所有已經(jīng)存在的像素格式光柵化處理器(pixel formatrasterizres)變得與cover_type 不兼容。它們確實(shí)是不兼容的,在進(jìn)行顏色混合時,如果中間值使用 32-bit 值來暫存的話,那么大只能使用 8-bit 的覆蓋值(coverage value)和 8-bit 的 alpha 值(alpha) 。如果使用 16-bit 的值的話,就要用64-bit 的中間值暫存,這對于 32-bit 的平臺來說會有非常昂貴的開銷。

void copy_hline(int x, int y, unsigned len,const color_type&c);

void copy_vline(int x, int y, unsigned len,const color_type&c);

使用某種顏色描畫一條水平或是垂直的線。

void blend_hline(int x, int y, unsignedlen, const color_type&c, int8u cover);

void blend_vline(int x, int y, unsignedlen, const color_type&c, int8u cover);

采用混合顏色的模式描畫一帶某種顏色的水平(或垂直線)線。之所以要分開 copy 和 blend 兩個版本,是因?yàn)榭紤]到效率問題。雖然可以使用一個if/else (其實(shí)在 blend 版的描畫函數(shù)中就有)來區(qū)分,但對于某些場合,比如要描畫很多小型標(biāo)識(markers)時,這會很影響效率,這種場景在不同的散點(diǎn)圖描畫程序(scatter plotapplicatioin)中常常遇到。

void blend_solid_hspan(int x, int y,unsigned len,

                      const color_type& c,const int8u* covers);

void blend_solid_vspan(int x, int y,unsigned len,

                      const color_type& c,const int8u* covers);

混合描畫一條水平或是垂直的 solid-color 的 span, Span與 hline 和 vline 幾乎是一樣的,但它擁有一個存有 coveragevalue 的數(shù)組。這兩個函數(shù)在渲染實(shí)心的去鋸齒多邊形時會用到。

void blend_color_hspan(int x, int y,unsigned len,

                      const color_type*colors, const int8u* covers);

void blend_color_vspan(int x, int y, unsignedlen,

                      const color_type*colors, const int8u* covers);

混合描畫水平或是垂直的顏色 span ,這兩個函數(shù)用于不同的 span 產(chǎn)生器中,比如說 gradient,p_w_picpath,patterns,Gouraud interpolation 等等。函數(shù)接受一個顏色數(shù)組參數(shù),這個顏色數(shù)組必須與所使用的像素格式兼容。比如說,所有 AGG 中已經(jīng)有的 RGB 像素格式都與 rgb8類型是兼容的。 covers 參數(shù)是一個 coverage value 的數(shù)組,這與 blend_solid_hspan 中的是一樣的。這是參數(shù)可選,可以設(shè)置為 0 。

下面這個例子是描畫陽光的光譜。rgba 類包含有 4 個浮點(diǎn)數(shù)的顏色部分(包括alpha),這個類有一個靜態(tài)函數(shù) from_wavelength ,以及相應(yīng)的構(gòu)造函數(shù)。rgba8 可以用 rgba 來構(gòu)造(在 AGG 中這是一個常見的策略,也就是任何的顏色類型都可以用 rgba 來構(gòu)造)。

2 學(xué)習(xí)的要點(diǎn)

該類是從像素的角度,來填充渲染緩存,通過指定rgb8結(jié)構(gòu)體,來填充渲染緩存的像素值。

這里多說一點(diǎn):rgb8是顏色值是8位的,范圍是(0,255),rgb是顏色值為浮點(diǎn)型(0,1).

3開銷

分析代碼:

   agg::rendering_buffer &rbuf = rbuf_window();

   agg::pixfmt_bgr24 pixf(rbuf);

   typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

   renderer_base_type renb(pixf);

agg::renderer_primitives<renderer_base_type>primitive(renb);

像素格式渲染器和基礎(chǔ)渲染器對象的構(gòu)建開銷是很小的,僅僅是獲取渲染緩存的指針,對渲染緩存進(jìn)行渲染的操作,沒有任何的內(nèi)存分配。比如生成像素格式渲染器pixfmt_bgr24,僅僅是將渲染緩存的指針賦值給pixfmt_bgr24的成員變量m_buf.

4 pixfmt_rgb24 PK pixfmt_bgr24

windows平臺下,申請的渲染緩存的顏色分量是排列如下:BGR,而不是平常的RGB。所以采用了pixfmt_bgr24,而不是pixfmt_rgb24, 對于OpenGL設(shè)置像素的時候,也是一樣的道理。

5 查看渲染緩存的顏色序列

  agg::rendering_buffer &rbuf =rbuf_window();

  agg::pixfmt_bgr24 pixf(rbuf);

agg::pixfmt_rgb24pixf1(rbuf);

 for (int i = 20;i<250;i++)

 {//渲染出紅色

    pixf.copy_hline(20,i,300,agg::rgba8(255,0,0));

 }

 for (int i = 20;i<250;i++)

 {//渲染出藍(lán)色

   pixf1.copy_hline(420,i,300,agg::rgba8(255,0,0));

 }

 提供如下的一種方式直接操作渲染緩存,查看是否是顏色序列不一樣導(dǎo)致的??

 agg::rendering_buffer &rbuf =rbuf_window();

  renb.clear(agg::rgba8(255,255,255));

   for (int i =0;i < rbuf.height();i++)

   {

     unsigned char* p = rbuf.row_ptr(i);

     for (int j=0;j<rbuf.width();j++)

     {

       *p++ = 255;//顯示結(jié)果為藍(lán)色

       *p++ = 0;

       *p++ = 0;

     }

   }

   for (int i =0;i < rbuf.height();i++)

   {

     unsigned char* p = rbuf.row_ptr(i);

     for (int j=0;j<rbuf.width();j++)

     {

       *p++ = 0;

       *p++ = 0;

       *p++ = 255;

     }

   }

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享標(biāo)題:AGG第二十五課pixelformatrenderers像素格式渲染器-創(chuàng)新互聯(lián)
本文地址:http://www.bm7419.com/article6/dcdeog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站排名品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)