齐天大圣副本杀大杀小:AGG 渲染器(Renderers)
来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 02:11:05
Renderers 渲染器
渲染器负责表现扫描线Scanline中的每个线段(span)。在渲染器之前,AGG图形中的线段是没有颜色值的,只是位置、长度和 覆盖率(透明度)。渲染器赋于线段色彩,最终成为一幅完整的图像。
渲 染器被分成底中高三层。其中底层负责像素包装,由PixelFormat Renderer实现;中层是基础层,在PixelFormat Renderer的基础上提供更多方法,是所有高层渲染器依赖的基础,由Base Renderer实现;高层负责渲染Scanline中的线段,由Scanline Renderer等实现。
Scanline Renderer
头文件
#include
类型
templateclass renderer_scanline_aa_solid; //实色AA渲染template class renderer_scanline_bin_solid; //实色原始渲染template class renderer_scanline_aa; // 自定义AA渲染template class renderer_scanline_bin; // 自定义原始渲染
以及自己写的实现了void prepare() 和 template
另外,头文件agg_renderer_scanline.h中 的render_scanlines函 数很重要,它是AGG显示流程的实现。
void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren);
从Rasterizer生成逐行的Scanline,然后交给Scanline Renderer渲染。
这 里还要提一下render_scanlines_aa_solid、render_scanlines_aa、 render_scanlines_bin_solid、render_scanlines_bin这 几个函数。它们的作用和 render_scanlines一 样,只是跳过了Scanline Renderer环节,直接向Base Renderer渲染。
void render_scanlines_aa_solid(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, const ColorT& color)templatevoid render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen);
实验代码(基于此 处代码)
把on_draw()方法里原
typedef agg::renderer_scanline_aa_solidrenderer_scanline_type;
改成
typedef agg::renderer_scanline_bin_solidrenderer_scanline_type;
得到的图形是:
去掉renderer_scanline_type以及所有的rensl相关语句,把
agg::render_scanlines(ras,sl,rensl);
改成
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,i*50));
同样可以得到我们想要的图形
Basic Renderers
头文件
#include#include
类型
templateclass renderer_base;
templateclass renderer_mclip;
构造函数
renderer_base(pixfmt_type& ren);参数ren指定底层的PixelFormat Renderer
成员方法
pixfmt_type& ren();返回底层的PixelFormat Rendererunsigned width() const;unsigned height() const; 宽高void reset_clipping(bool visibility);设置是否可见
clipping box=visibility?(0,0,width-1,height-1):(1,1,0,0)bool clip_box(int x1, int y1, int x2, int y2);设置clipping box,renderer_base专有void add_clip_box(int x1, int y1, int x2, int y2);添加clipping box,renderer_mclip专有bool inbox(int x, int y) const;x,y点是否在clipping box内,renderer_base专有void first_clip_box();
bool next_clip_box();切换clipping box,renderer_mclip专用const rect& clip_box() const;
int xmin() const;
int ymin() const;
int xmax() const;
int ymax() const;
const rect& bounding_clip_box() const;
int bounding_xmin() const;
int bounding_ymin() const;
int bounding_xmax() const;
int bounding_ymax() const; 返回clipping box大小void clear(const color_type& c);以颜色c填充所有区域void copy_pixel(int x, int y, const color_type& c);
void blend_pixel(int x, int y, const color_type& c, cover_type cover);
color_type pixel(int x, int y) const;
void copy_h(v)line(int x1, int y, int x2, const color_type& c);
void blend_h(v)line(int x1, int y, int x2,
const color_type& c, cover_type cover);
void blend_solid_h(v)span(int x, int y, int len,
const color_type& c, const cover_type* covers);
void blend_color_h(v)span(_no_slip)(int x, int y, int len,
const color_type* colors, const cover_type* covers);见后文的PixelFormat Renderervoid copy_from(const rendering_buffer& from,
const rect* rc=0,
int x_to=0,
int y_to=0);从from复制一个矩形区域过来,rc指定源区域,x_to,y_to指定目标位置
实验代码(基于此 处代码)
在on_draw()方法的renb.clear(agg::rgba8(255,255,255));语句后面加上:
- renb.clear(agg::rgba8(255,255,255));
- renb.clip_box(30,30,160,160); // 设置可写区域
得到的图形是:
PixelFormat Renderer
PixelFormat Renderer的作用是以指定的颜色空间来包装原始的Rendering Buffer(见后文),AGG把它归类于底层Renderer。
Rendering Buffer是以字节为单位的,而PixelFormat Renderer则是以像素为单位的。
头文件
#include "agg_pixfmt_rgb.h#include "agg_pixfmt_gray.h"
类型
pixfmt_gray8pixfmt_rgb24
pixfmt_bgr24
pixfmt_rgba32
pixfmt_bgr24_gamma
...
构造函数
pixfmt_base(rbuf_type& rb);rb参数为Rendering Buffer类型
类型定义
typedef color_type;像素类型需要了解的是在AGG中像素也是一个功能完善的类,常用的有rgba、rgba8、gray8。
rgba里每个颜色分量用double表示,范围从0~1。其它像素类后面的数字代表每个颜色分量占用的位数。大部分像素类都可以从rgba构造。
同时, 像素类还有gradient等牛X的颜色计算方法。typedef value_type;单个颜色分量的类型typedef order_type;颜色排序方式,我们可以通过里面的枚举值R G B A得到各颜色分量所在位置,常用的有order_rgb,order_bgr,order_rgba。
这是order_rgb的定义: struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag }; };
成员方法
unsigned width()unsigned height()宽高color_type pixel(int x, int y);
void copy_pixel(int x, int y, const color_type& c);取得、设置指定点的颜色void blend_pixel(int x, int y, const color_type& c, int8u cover);设置指定点颜色,与原颜色有混合效果,强度由cover指定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);从x,y开始画一条长度为len的线,颜色为c,同样有blend_版本void blend_solid_h(v)span(int x, int y, unsigned len,
const color_type& c, const int8u* covers);
void blend_color_h(v)span(int x, int y, unsigned len,
const color_type* colors, const int8u* covers);类似hline和vline版本,color版指定一组颜色,依次着色。covers指定覆盖率
实验代码(基于此 处代码)
在on_draw()方法的最后加上:
- //从50,20开始,画20条长度为100的坚线,颜色从黑渐变到红,覆盖率为128(半透明)
- for(int i=0; i<20; i++)
- pixf.blend_vline(50+i,20,100,agg::rgba(i/20.0,0,0),128);