中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

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

1 聲明

看看這個(gè)聲明:

創(chuàng)新互聯(lián)長(zhǎng)期為超過千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(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)建了一個(gè)底層的像素渲染對(duì)象(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ì)算對(duì)于特定點(diǎn) X 的偏移。你可能會(huì)說,如果在 rendering buffer 中保存像素的寬度值的話會(huì)更容易,但是在實(shí)踐中會(huì)有很多限制。別忘了,像素寬度可能比一個(gè)字節(jié)還小,比如在打印機(jī)渲染高解析度的 B&W 圖像的時(shí)候就是這樣。因此,我們需要將這個(gè)功能分離出來,rendering_buffer 這個(gè)類就用于加速對(duì)“行”的訪問,而 pixelformat renderers 就負(fù)責(zé)如何解析“行”是什么。

pixel_formats_rgb24(rendering_buffer&rb);

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

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,那么它就簡(jiǎn)單地把所有值都拷貝過來,包括 R、G、B,以及 alpha 通道值。

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

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

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 兩個(gè)版本,是因?yàn)榭紤]到效率問題。雖然可以使用一個(gè)if/else (其實(shí)在 blend 版的描畫函數(shù)中就有)來區(qū)分,但對(duì)于某些場(chǎng)合,比如要描畫很多小型標(biāo)識(shí)(markers)時(shí),這會(huì)很影響效率,這種場(chǎng)景在不同的散點(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 幾乎是一樣的,但它擁有一個(gè)存有 coveragevalue 的數(shù)組。這兩個(gè)函數(shù)在渲染實(shí)心的去鋸齒多邊形時(shí)會(huì)用到。

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

下面這個(gè)例子是描畫陽光的光譜。rgba 類包含有 4 個(gè)浮點(diǎn)數(shù)的顏色部分(包括alpha),這個(gè)類有一個(gè)靜態(tài)函數(shù) from_wavelength ,以及相應(yīng)的構(gòu)造函數(shù)。rgba8 可以用 rgba 來構(gòu)造(在 AGG 中這是一個(gè)常見的策略,也就是任何的顏色類型都可以用 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ǔ)渲染器對(duì)象的構(gòu)建開銷是很小的,僅僅是獲取渲染緩存的指針,對(duì)渲染緩存進(jìn)行渲染的操作,沒有任何的內(nèi)存分配。比如生成像素格式渲染器pixfmt_bgr24,僅僅是將渲染緩存的指針賦值給pixfmt_bgr24的成員變量m_buf.

4 pixfmt_rgb24 PK pixfmt_bgr24

windows平臺(tái)下,申請(qǐng)的渲染緩存的顏色分量是排列如下:BGR,而不是平常的RGB。所以采用了pixfmt_bgr24,而不是pixfmt_rgb24, 對(duì)于OpenGL設(shè)置像素的時(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小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享標(biāo)題:AGG第二十五課pixelformatrenderers像素格式渲染器-創(chuàng)新互聯(lián)
本文地址:http://www.rwnh.cn/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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
鄄城县| 冕宁县| 广州市| 德格县| 合水县| 启东市| 砀山县| 三亚市| 罗江县| 高阳县| 虹口区| 福鼎市| 邵阳县| 乌拉特中旗| 昭觉县| 庄河市| 肥东县| 陈巴尔虎旗| 乌兰察布市| 临海市| 霍城县| 班戈县| 大余县| 钟山县| 汾阳市| 英山县| 饶阳县| 长沙市| 渭源县| 江阴市| 乌兰察布市| 上犹县| 鄄城县| 凤冈县| 夏邑县| 山丹县| 安乡县| 杭锦后旗| 萨迦县| 鸡泽县| 东乌珠穆沁旗|