zoukankan      html  css  js  c++  java
  • [翻译]AGG reference 之 Scanline Containers

    Introduction

    (译注:这篇 reference 好像没有写完,所以下面只是将官方释出的部分进行了翻译)

    原文链接:http://www.antigrain.com/doc/scanlines/scanlines.agdoc.html

    翻译:唐风

    底层的 render 操作的是最简单的数据形式,当然它们本身也很简单。其实 pixel format renderer 并不是 AGG 必须的组成部分,它们是可以替换或是改写的。比如说,如果你有一个功能相似的 API,而且这个 API 带有硬件加速,那么使用这个 API 来代替纯软件的混合渲染(主要是 alpha 混合)会更好。当然,也可以使用 Intel SSE/SSE2 来编写优化过的 renderer。AGG 其它的渲染功能都是基于这些简单的类。
    描画去锯齿的对象时我们首先要对它进行光栅化。AGG 中主要的光栅化技术是基于 scanline 的,也就是说,一个多边形会先转换成很多的水平扫描线,然后再逐个描画这些扫描线。同样的, scanline rasterizer 并不是唯一可以用于生成水平扫描线(scanline)的类,你也可以使用一些容器,甚至是你自己的  super-ultra-mega rasterizer 。

    在从 rasterizer(光栅化器) 到 scanline renderer 之间的信息转换时,用到了 scanline 容器。一个 scanline 由很多的水平的、不相交的 span 组成。这些 span 按 x 轴排序。这就意味着并没有提供排序这个操作,必须在将 span 添加到 scanline 时就把顺序处理好。如果顺序不是按要求排列的,那么可能会出现未定义的行为。

    AGG 中有以下三种 scanline 容器。

    1. scanline_u - 未包装的 scanline 容器。
    2. scanline_p - 包装过的 scanline 容器。
    3. scanline_bin - 原始的,“带锯齿”的 scanline 容器。

    前面两种容器可以包含去锯齿信息,第三种不行。

    重要信息!
    所有的 scanline 容器都为速度进行过优化,但没有考虑内存用量。事实上,它们会为最坏情况申请内存,所以有开销有点大。如果你只是使用少量的 scanline 的话,这不会成为瓶颈,但如果为存储整个形状而使用 scanline 的数组可能不是一个好主意,因为这会使用超出结果图像大小的内存量。

    包装的(packed) scanline 与未包装的(unpacked) scanline 的区别在于, unpacked scanline 总是会为所有像素保存覆盖值(coverage value),包括那些全部覆盖在多边形内部的像素。而 packed scanlines 则会把具有相同 coverage value 的像素合并成 solid span。

    tmp84

    tmp85

    看起来好像使用 packed 版的 scanline 总是会好一点,但在实践中并非如此。但你渲染一些大型的实心多边型时,使用 scanline_p 会更快,那是因为多边型的面积比周长要大很多(从像素的角度来衡量)。但是如果是渲染字符的时候绝对应该使用 scanline_u ,这样就能处理更少的 span 了,(scanline_u 会比 scanline_p)大约少产生三倍左右的 span,而 span 数本身就是一项重要的开销。同样的,在大多数 span 产生器中(比如 gradients, Gouraud shader, 以及 image 产生器等),span 的数量更加是(效能的)关键,所以一般也不会使用 scanline_p。

     

    ---- 总会有一个人需要你的分享~! 唐风: www.cnblogs.com/muxue ------
  • 相关阅读:
    常见前端面试题CSS部分
    window.location
    实时时间设置
    常用兼容处理
    背景淡入淡出切换
    常用插件
    PHP文件处理函数
    PHP的数据处理函数二(数组)
    php的数据处理函数一(字符串)
    PHP环境搭建(phpstudy)
  • 原文地址:https://www.cnblogs.com/muxue/p/1755046.html
Copyright © 2011-2022 走看看