【実施例】
【0040】
図14から
図18を参照して、実施例に係る画像処理装置1について説明する。上記比較例の問題点を解決するため、実施例の画像処理装置1は、交点情報にレイヤ番号を付加して保存する。レイヤ番号は、例えば、図形ごとに与えられる0から始まる整数である。実施例では、レイヤ番号が大きいほど図形の重ねあわせ、つまり図形間の階層関係で上位の図形とする。レイヤ番号は、例えば、CPU上のソフトウェアの処理で与えるものとしてもよい。
【0041】
図14にレイヤ付き交点情報の交点バッファ上のフォーマットを例示する。
図14のように、実施例の交点情報は、比較例の
図16において、予備エリア(Reserved)が、レイヤ番号(Layer[3:0])となっている。
図14の例では、レイヤ番号は4ワードで設定される。
【0042】
図15に、実施例に係る画像処理装置1と、CPU102とを含む情報処理装置の構成を例示する。画像処理装置1は、エッジ生成部12、シーケンサ13、交点生成部14、ソータ15、スパン生成部16、交点バッファ17、ラスタライザ18、およびピクセル処理部19を含む。エッジ生成部12、シーケンサ13、交点生成部14、ソータ15、スパン生成部16、交点バッファ17、ラスタライザ18、およびピクセル処理部19等は、例えば、コンピュータプログラムを実行するDSPであってもよい。また、例えば、ハードウェア記述言語によって画像処理装置1に含まれる各構成部分の処理を記述し、ハードウェア回路によって、各構成部分の処理を実行してもよい。また、画像処理装置1に含まれる各構成部分の処理うち、一部をDSPがコンピュータプログラムによって実行し、一部をハードウェア回路によって実行してもよい。
【0043】
実施例では、CPU102は、例えば、画像処理プログラムを実行し、図形情報とともに、レイヤ番号を含む情報を画像処理装置1に引き渡す。一方、シーケンサ13は、レジスタを有しており、現在処理中の図形のレイヤ番号を保持する。シーケンサ13は、例えば、図形情報の切り替わりごとに、レイヤ番号を交点生成部14に引き渡せばよい。交点生成部14は、生成した交点情報に、シーケンサ13から引き渡されたレイヤ番号を付与する。レイヤ番号を付与された交点情報は、交点バッファ17に保持される。スパン生成部16は、交点情報に付されたレイヤ番号によって、スパンの上下関係を判断しつつ、スパンを生成する。
【0044】
一方、実施例のエッジ生成部12、ソータ15、ラスタライザ18、およびピクセル処理部19の処理は、それぞれ比較例のエッジ生成部112、ソータ115、ラスタライザ118、およびピクセル処理部119の処理と同様である。
【0045】
図16から
図18によりスパン生成部16の処理を例示する。
図16に、スパン生成部16が実行するスパン生成処理のフローチャートを例示する。
図16の処理では、まず、スパン生成部16は、注目レイヤ番号を初期値設定する(S1)。注目レイヤ番号は、現在処理中のレイヤ番号を意味する。注目レイヤ番号の初期値は、例えば、最下層のレイヤを示す0である。
【0046】
次に、スパン生成部16は、水平線位置を初期値設定する(S2)。水平線位置とは、例えば、画像中のラスタの番号であり、
図8の交点バッファ117の縦方向の番号(0〜H−1)で例示される。なお、実施例においても、交点バッファの構成は、比較例の
図8と同様である。また、S2の処理とともに、スパン生成部16は、各レイヤのカバー値情報を0クリアする。すなわち、各レイヤには、エッジと重なりのない状態を示す初期値が設定される。
【0047】
次に、スパン生成部16は、現在処理中の水平線で交点バッファ読み出し初期位置を設定する(S3)。交点バッファ読み出し位置は、例えば、
図8の交点バッファ117の横方向の番号(0〜k−1)で例示される。交点バッファ読み出し初期位置は、例えば、0である。
【0048】
そして、スパン生成部16は、交点処理を実行する(S4)。交点処理は、水平線と図形エッジの交点座標において、エッジとピクセルとの関係を示すカバー値を算出するとともに、図形の水平線上の存在範囲を示すスパンを上位レイヤ優先で算出する処理である。S4の詳細は、
図17、
図18にしたがって、後述する。
【0049】
S4において1つの交点座標における処理を実行後、スパン生成部16は、現在の水平線に次の交点があるか否かを判定する(S5)。現在の水平線に次の交点がある場合、スパン生成部16は、制御をS4に戻す。一方、現在の水平線に次の交点がない場合、スパン生成部16は、水平線を更新するとともに、各レイヤのカバー値情報を0クリアする(S6)。そして、スパン生成部16は、全水平線の処理が終了したか否かを判定する(S7)。全水平線の処理が終了していない場合、スパン生成部16は、制御をS3に戻す。すなわち、スパン生成部16は、次の水平線で、交点バッファ読み出し初期位置から処理を実行する。
【0050】
一方、S7の判定で、全水平線の処理が終了した場合、スパン生成部16は、注目レイヤ番号を更新する(S8)。そして、スパン生成部16は、全レイヤ番号の処理が終了したか否かを判定する(S9)。なお、レイヤ番号の最大値は、例えば、CPU102からシーケンサ13を通じて、スパン生成部16に引き渡される。現在の水平線で全レイヤ番号の処理が終了していない場合、スパン生成部16は、制御をS2に戻す。つまり、新たな注目レイヤ番号において、水平線の初期位置から処理を実行する。
【0051】
一方、全レイヤの処理が終了した場合、スパン生成部16は、スパン生成処理を終了する。なお、
図16の処理では、外側のループで注目レイヤ番号を更新し、内側のループで水平線を更新した。しかし、スパン生成部16の処理が、
図16に限定される訳ではない。例えば、スパン生成部16は、外側のループで水平線を更新し、内側のループの注目レイヤ番号を更新してもよい。
【0052】
図17に、交点処理(
図16のS4)の詳細を例示する。
図17の処理では、スパン生成部16は、水平線上の1つの交点座標において、カバー値の算出と、スパンの算出を実行する。
【0053】
図17の例では、まず、スパン生成部16は、交点バッファから交点情報を読む(S40)。そして、スパン生成部16は、読み出した交点情報のレイヤ番号が注目レイヤ番号より下層か否かを判定する(S41)。読み出した交点情報のレイヤ番号が注目レイヤ番号以上の場合、スパン生成部16は、読み出した交点情報のカバー値情報を基に、レイヤごとにスパンのカバー値情報を算出する(S42)。
【0054】
S42の処理では、スパン生成部16は、まず、比較例の
図9および
図11に示した処理と同様の処理を実行する。すなわち、スパン生成部16は、交点上でエッジが上向きか下向きかを判定する。そして、スパン生成部16は、交点情報が上向きエッジを示す場合には、交点情報が示すレイヤにおいて、スパンの現在のカバー値情報の各ワードに、S41で読み出した交点のカバー値情報の各ワードを加算する。一方、スパン生成部16は、交点情報が下向きエッジを示す場合には、交点情報が示すレイヤにおいて、スパンの現在のカバー値情報の各ワードから、S41で読み出した交点のカバー値情報の各ワードを減算する。
【0055】
そして、スパン生成部16は、各交点座標において、サブピクセルのカバー値情報を基に、各スパンにおける交点のカバー値を算出する。サブピクセルのカバー値情報を基に、各スパンにおける交点のカバー値を算出する処理は、比較例において
図12にしたがって例示した処理と同様である。すなわち、スパン生成部16は、0以外のサブピクセル数と、ピクセルに含まれる全サブピクセル数の比率を求めてもよい。また、スパン生成部16は、サブピクセルのカバー値情報(Mark1[0:3]、Mark2[0:3]、Mark3[0:3]、Mark4[0:3])各ビットごとの加算値)が奇数のサブピクセル数と、ピクセルに含まれる全サブピクセル数の比率を求めてもよい。なお、読み出した交点情報のレイヤ番号が注目レイヤ番号より下層の場合、スパン生成部16は、S42の処理を実行しないで、そのままS43に処理を進める。そして、スパン生成部16は、交点バッファ上の次の交点情報の交点の座標が、現在処理中の交点情報の交点の座標と同一か否かを判定する(S43)。ここで、交点の座標が同一とは、2つの交点が重なっていることを意味する。次の交点の座標が、現在処理中の交点の座標と同一の場合、スパン生成部16は、制御をS40に戻す。すなわち、スパン生成部16は、重複した交点座標を有するすべての交点情報に対して、
図17の交点処理を実行する。
【0056】
一方、次の交点の座標が、現在処理中の交点の座標と異なる場合、スパン生成部16は、スパン生成部16は、次の交点情報を一時的にレジスタ等に保持する(S44)。以下、一時的にレジスタに保持した交点情報の交点座標をX2とする。なお、S40で読み出した現在の交点情報の交点座標を以下の処理ではX1とする。
【0057】
そして、スパン生成部16は、スパン計算を実行する(S45)。スパン計算では、交点座標が同一の複数の交点情報、または単一の交点情報を基に、スパンの開始、スパンの終了、またはスパンの継続が判断される。
【0058】
図18に、スパン計算(
図17のS45)の詳細を例示する。すなわち、上位レイヤの交点座標X1でのカバー値が0.0より大きく、上位レイヤのスパン未継続のとき、スパン生成部16は、交点座標X1のピクセルを上位レイヤのスパンの始点に設定する。ここで、スパン未継続とは、スパンの始点が設定されていない状態をいう。さらに、スパン生成部16は、始点の右隣のピクセルのカバー値を計算し、次の交点までのカバー値に設定する(S451)。
【0059】
また、上位レイヤの次の交点X2のカバー値が0.0で、上位レイヤのスパン継続中のとき、スパン生成部16は、次の交点X2の左隣の座標X2−1のピクセルを上位レイヤのスパンの終点に設定する(S452)。次に、スパン生成部16は、交点座標X1に、カバー値1の上位レイヤがあるか否かを判定する(S453)。交点座標X1に、カバー値1の上位レイヤがあるときで、注目レイヤのスパン継続中のとき、スパン生成部16は、交点座標X1の左側の座標X1−1のピクセルを注目レイヤのスパンの終点に設定する(S454)。さらに、本実施例においては、スパン生成部16は、注目レイヤの現在の交点座標X1でのカバー値および座標X1+1のカバー値を算出する。そして、スパン生成部16は、座標X1+1のカバー値を次の交点までのカバー値とする。すなわち、本実施例においては、カバー値1の上位レイヤがある場合でも、注目レイヤのカバー値が0になるまでは、注目レイヤのカバー値を算出しておく。
【0060】
さらに、S454では、注目レイヤが継続中でなく、注目レイヤカバー値が0より大きくなった場合には、スパン生成部16は、現在の交点座標X1を注目レイヤのスパンの始点に設定する。さらに、スパン生成部16は、注目レイヤの現在の交点座標X1でのカバー値および座標X1+1のカバー値を算出する。そして、スパン生成部16は、座標X1+1のカバー値を次の交点までのカバー値とする。上述のように、現在交点座標X1において、注目レイヤのスパンが継続していて、上位レイヤの交点が1未満に変化した場合は、現在の交点座標X1に注目レイヤの交点がなくても注目レイヤのスパンの始点とする必要がある。そのため、カバー値1の上位レイヤが存在する場合でも、注目レイヤについて、始点の設定と、カバー値の計算とを実行しておくのである。
【0061】
その後、スパン生成部16は、スパン計算1の処理を終了する。一方、交点座標Xに、カバー値1の上位レイヤがないときには、スパン生成部16は、S455からS457の処理を実行する。すなわち、注目レイヤの交点座標X1でのカバー値が0.0より大きく、注目レイヤのスパン未継続のとき、スパン生成部16は、交点座標X1のピクセルを注目レイヤのスパンの始点に設定する。また、スパン生成部16は、始点の右隣のピクセルのカバー値を計算し、次の交点までのカバー値に設定する。注目レイヤの次の交点座標X2までのカバー値を現在のカバー値と呼ぶ。さらに、スパン生成部16は、交点座標X1から次の交点座標X2−1までのスパン情報をラスタライザ18に送出する(S455)。したがって、本実施例の処理では、次の交点X2のカバー値が0でなくても一旦スパンは終了する。ただし、S455の処理に代えて、スパン生成部16が次の交点X2のカバー値が0になるまで、スパンを継続し、次の交点X2のカバー値が0になったときに、スパン情報をラスタライザ18に送出するようにしてもよい。
【0062】
さらに、スパン生成部16は、現在の交点X1に注目レイヤがなく、注目レイヤの現在のカバー値が0.0より大きく、かつ、上位レイヤのカバー値が現在の交点X1で1.0未満に変化した場合、現在の交点X1をスパンの始点に設定する(S456)。S456の処理は、上位レイヤに隠されていた、スパン継続中の注目レイヤが表れたことに対応する。この場合には、上位レイヤに隠されていた注目レイヤのスパンが開始する。
【0063】
さらにまた、注目レイヤの次の交点X2のカバー値が0.0で、注目レイヤのスパン継続中のとき、スパン生成部16は、次の交点X2座標の左隣の座標X2−1のピクセルを注目レイヤのスパンの終点に設定する(S457)。
【0064】
図18の手順を交点座標ごとに繰り返すにより、上位レイヤが存在しない場合には、S455の処理で、注目レイヤのスパンの始点が設定される。一方、交点座標に、カバー値1の上位レイヤが存在する場合でも、S454の説明で述べたように、注目レイヤのスパンの始点と次の交点までの現在のカバー値が設定される。すなわち、本実施例では、上位
レイヤのカバー値が1以上の場合も、注目レイヤの始点とカバー値は一応算出される。
【0065】
しかしながら、上位レイヤのカバー値が1の場合、S453の判定がYESとなり、S455からS457の処理が省略される。その結果、交点にカバー値1の上位レイヤが存在する場合には、注目レイヤに対するスパン情報の出力が省略される。したがって、上位レイヤの図形によって隠される範囲では、当該スパンのピクセルは生成されず、図形処理装置1は、ベクタグラフィックスにおいて、効率的にピクセルを作成できる。
【0066】
さらに、複数の交点座標に対するスパン計算1の処理(
図18)の繰り返しにおいて、水平線上で上位レイヤの交点に到達した場合にS452の処理によって、注目レイヤのスパンの終点が設定される。また、水平線上で、注目レイヤの図形の右側エッジに達した場合には、S457の処理によって、注目レイヤのスパンの終点が設定される。
【0067】
(変形例)
図17、
図18では、交点のカバー値をサブピクセルのカバー値情報から得られる0〜1の間の値として、算出した。しかし、このような手順に代えて、交点のカバー値を0か1かに限定してもよい。例えば、図形処理装置1は、
図14の交点情報において、Mark1[3:0]からMark4[3:0]に代えて、交点の有無を示す1ビットのフラグによって、交点の有無を記憶すればよい。その場合には、
図17のS43の交点のカバー値計算としては、スパン生成部16は、単に、交点情報から、交点の有無を示す1ビットのフラグを読み出せばよい。
【0068】
図19に、カバー値を0か1に限定する場合のスパン計算(
図17のS45)の詳細を例示する。すなわち、上位レイヤの交点座標X1でのカバー値が1であり、かつ、上位レイヤのスパン未継続のとき、スパン生成部16は、交点座標X1のピクセルを上位レイヤのスパンの始点に設定する(T451)。
【0069】
また、上位レイヤの次の交点座標X2のカバー値が0で、上位レイヤのスパン継続中のとき、スパン生成部16は、次の交点座標X2の左隣の座標X2−1のピクセルを上位レイヤのスパンの終点に設定する(T452)。
【0070】
次に、スパン生成部16は、交点座標X1に、カバー値1の上位レイヤがあるか否かを判定する(T453)。交点座標X1に、カバー値1の上位レイヤがあるときで、注目レイヤのスパン継続中のとき、スパン生成部16は、交点座標X1の左隣の座標X1−1のピクセルを注目レイヤのスパンの終点に設定する(T454)。さらに、T454において、注目レイヤが継続中でなく、注目レイヤカバー値が1となった場合には、スパン生成部16は、現在の交点座標X1を注目レイヤのスパンの始点に設定する。さらに、注目レイヤの現在の交点座標X1でのカバー値および座標X1+1のカバー値を算出する。そして、スパン生成部16は、座標X1+1のカバー値を次の交点までのカバー値とする。この処理は、S454と同様である。
【0071】
一方、交点座標X1に、カバー値1の上位レイヤがないときには、スパン生成部16は、T455からT457の処理を実行する。すなわち、注目レイヤの交点座標X1でのカバー値が1であり、かつ、注目レイヤのスパン未継続のとき、スパン生成部16は、交点座標X1のピクセルを注目レイヤのスパンの始点に設定する。また、現在の交点座標X1の右隣から次の交点座標X2までのカバー値を1に設定する。そして、スパン生成部16は、現在の交点座標X1から次の交点X2−1までのスパン情報をラスタライザ1に送出する(T455)。
【0072】
さらに、スパン生成部16は、現在の交点X1に注目レイヤがなく、注目レイヤの現在
のカバー値が1であり、かつ、上位レイヤのカバー値が現在の交点X1で0に変化した場合、現在の交点X1をスパンの始点に設定する(T456)。T456の処理は、S456と同様である。さらにまた、注目レイヤの次の交点座標X2のカバー値が0で、注目レイヤのスパン継続中のとき、スパン生成部16は、次の交点座標X2の左隣の座標X2−1のピクセルを注目レイヤのスパンの終点に設定する(T457)。
【0073】
以上述べたように、カバー値を0か1に限定し、サブピクセルによってカバー値を算出しない場合でも、
図16−
図18と同様に、図形の上位レイヤと下位レイヤの関係から、効率的なピクセルの生成が可能である。
【0074】
すなわち、上位レイヤのカバー値が1の場合、T453の判定がYESとなり、T455からT457の処理が省略される。その結果、交点にカバー値1の上位レイヤが存在する場合には、注目レイヤに対するスパン情報の出力が省略される。したがって、上位レイヤの図形によって隠される範囲では、当該スパンのピクセルは生成されず、図形処理装置1は、ベクタグラフィックスにおいて、効率的にピクセルを作成できる。
【0075】
さらに、複数の交点座標に対するスパン計算2の処理(
図19)の繰り返しにおいて、水平線上で上位レイヤの交点に到達した場合にT452の処理によって、注目レイヤのスパンの終点が設定される。また、水平線上で、注目レイヤの図形の右側エッジに達した場合には、T456の処理によって、注目レイヤのスパンの終点が設定される。
【0076】
なお、
図19の処理を
図18と比較した場合、
図18では、交点のカバー値が0から1の範囲の値を取り得るため、上位レイヤの図形が半透明となって下位レイヤの図形を表示する場合があり、スパン生成部16は、始点から次の交点までのカバー値を維持する(
図18のS455)。一方、
図19では、カバー値は、0または1のいずれかであるので、始点から終点まではカバー値が確定しており、スパン生成部16は、始点から次の交点までのカバー値を維持する必要がない(
図19のT455)。
【0077】
(その他)
以下、本実施形態で説明したベクタグラフィックスにおけるピクセルの処理と、3次元グラフィックスでのZバッファ法との違いを説明する。3次元グラフィックスにおける隠面処理に用いられるZバッファ法では、図形処理装置は、ピクセル単位で奥行き情報(Z値)を持ちピクセル単位でZ値比較する。これに対して、本実施形態の図形処理装置1は、ピクセルの集合であるスパン単位で処理するため、より効率よく隠面処理を実行できる。
【0078】
《コンピュータが読み取り可能な記録媒体》
コンピュータその他の機械、装置(以下、コンピュータ等)に上記いずれかの機能を実現させるプログラムをコンピュータ等が読み取り可能な記録媒体に記録することができる。そして、コンピュータ等に、この記録媒体のプログラムを読み込ませて実行させることにより、その機能を提供させることができる。
【0079】
ここで、コンピュータ等が読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、コンピュータ等から読み取ることができる記録媒体をいう。このような記録媒体のうちコンピュータ等から取り外し可能なものとしては、例えばフレキシブルディスク、光磁気ディスク、CD−ROM、CD−R/W、DVD、ブルーレイディスク、DAT、8mmテープ、フラッシュメモリなどのメモリカード等がある。また、コンピュータ等に固定された記録媒体としてハードディスクやROM(リードオンリーメモリ)等がある。