以下、図面を参照し、この発明の実施の形態を説明する。
<第1実施形態>
[1.画像処理装置の構成の概略]
図1は、この発明の第1実施形態である画像処理装置100の構成を示すブロック図である。この画像処理装置100は、3次元のオブジェクトを任意の視点から見た2次元画像の画像データを生成し、ディスプレイ200に表示させる装置である。
図1に示すように、画像処理装置100は、ジオメトリ処理部1と、ラスタライザ2と、ピクセル処理部3と、表示制御部4と、メモリ部51と、メモリコントローラ52と、キャッシュメモリ53とを有する。ジオメトリ処理部1は、ディスプレイ200の表示画面に表示させる3次元のオブジェクトの表面を三角形や四角形等のプリミティブの集合により近似し、表示画面内に表示させる2次元の各プリミティブの各頂点の属性値を発生する手段である。ここで、プリミティブの各頂点の属性値には、表示画面内におけるプリミティブの各頂点の座標、各頂点のカラー、各頂点に適用するテクスチャ座標、3次元のオブジェクトの表面における各頂点の法線ベクトル等が含まれる。ジオメトリ処理部1は、オブジェクトを構成する各プリミティブの各頂点の属性値を各プリミティブの描画順にラスタライザ2に供給する。
ラスタライザ2は、ジオメトリ処理部1から供給される各プリミティブの各頂点の属性値に基づいて各プリミティブの描画処理を行う手段である。この描画処理において、ラスタライザ2は、表示画面上においてプリミティブの占める領域を求め、当該領域内に属するピクセル列の属性値を当該プリミティブの各頂点の属性値に基づいて生成し、ピクセル処理部3に供給する。なお、ラスタライザ2が実行する描画処理の詳細については後述する。
メモリ部51は、フレームメモリ、テクスチャメモリ等の各種のメモリを含む。フレームメモリは、ディスプレイ200に表示させるフレーム上の各ピクセルのカラーデータを記憶するメモリである。テクスチャメモリは、表示対象である各プリミティブの表面に貼り付けるテクスチャの画像データ(カラーデータを含む)を記憶したメモリである。メモリコントローラ52は、メモリ部51の各メモリに対するアクセスを制御する装置である。キャッシュメモリ53は、メモリ部51のフレームメモリ、テクスチャメモリ等の大容量メモリから読み出したデータを一時記憶するためのメモリである。なお、メモリ部51を構成する各メモリのうち大容量のメモリは、画像処理装置100の外付けのメモリとしてもよい。
ピクセル処理部3は、ラスタライザ2から供給されるプリミティブ内のピクセル列の属性値に基づいて、各ピクセルのカラーデータを生成し、キャッシュメモリ53およびメモリコントローラ52を介してメモリ部51のフレームメモリに書き込む。その際、ピクセル処理部3は、ラスタライザ2から供給される属性値に基づいて、プリミティブに貼り付けるべきテクスチャを求め、そのテクスチャのカラーデータをテクスチャメモリから読み出して、プリミティブのピクセル列のカラーデータの演算に用いる。また、バイリニアフィルタ等のフィルタ処理が必要な場合、ピクセル処理部3は、カラーデータの書き込みを行うピクセルとその周辺のピクセルのカラーデータをフレームメモリから読み出してフィルタ処理に使用する。なお、キャッシュメモリ53に該当するピクセルのカラーデータが記憶されている場合は、キャッシュメモリ53からカラーデータを取得する。
表示制御部4は、ディスプレイ200へ垂直同期信号、水平同期信号を出力し、これらの同期信号に同期して、メモリ部51のフレームメモリからメモリコントローラ52を介してカラーデータを順次読み出し、ディスプレイ200の表示画面に表示させる。
以上が本実施形態による画像処理装置100の構成の概略である。
[2.ラスタライザ2の特徴]
この画像処理装置100において、メモリ部51のフレームメモリは、例えばSDRAMにより構成されている。このフレームメモリについては、アクセス効率を高くするため、ページ単位で、連続したアドレスにアクセスを行うことが求められる。従って、フレームメモリにピクセル列のカラーデータを書き込む場合、ピクセル列は、あまり長くならないようにすることが好ましい。ピクセル列が長くなると、各ピクセルのカラーデータの書き込み先アドレスが複数のページに跨ることとなり、アクセス効率を低下させるからである。
また、この画像処理装置100では、テクスチャマッピングを伴う描画処理を実行する場合がある。その際、メモリ部51のテクスチャメモリに記憶されたテクスチャデータの中からプリミティブに貼り付けるテクスチャのテクスチャデータを読み出してキャッシュメモリ53に一時記憶させ、テクスチャマッピングに使用する。この場合、キャッシュメモリ53には、必要なテクスチャデータを含む小領域のテクスチャデータが記憶される。従って、キャッシュメモリ53を利用したテクスチャマッピングにおいてキャッシュミスを発生させないためにも、連続的に描画するピクセル列の長さはあまり長くない方が好ましい。何故ならば、例えば長いピクセル列をプリミティブが含む場合、次のような問題が起こり得るからである。まず、テクスチャメモリから必要なテクスチャデータを含む小領域のテクスチャデータを読み出してキャッシュメモリ53に記憶させ、このキャッシュメモリ53のテクスチャデータを使用して、あるスキャンライン上のプリミティブへのテクスチャマッピングを行ったとする。このスキャンラインの次のスキャンラインも同じプリミティブを横切っている。従って、次のスキャンライン上のプリミティブへのテクスチャマッピングのためのテクスチャデータがキャッシュメモリ53に残っていれば、そのテクスチャデータをテクスチャマッピングに使用可能である。しかし、プリミティブに含まれるピクセル列が長い状況では、キャッシュメモリ53におけるテクスチャデータの入れ替えが頻繁に行われる。このため、スキャンライン上のプリミティブへのテクスチャマッピングを行おうとする際に、必要なテクスチャデータがキャッシュメモリ53から既に追い出されており、キャッシュミスになる、という問題が起こり得るのである。
また、画像処理装置100は、描画処理の際にバイリニアフィルタ等のフィルタ処理を実行する場合がある。従って、このフィルタ処理を効率的に実行するためにも、連続的に描画するピクセル列は、あまり長くならないことが好ましい。連続的に描画するピクセル列を短くすることにより、複数ページに跨るアクセスが減るからである。
そこで、本実施形態におけるラスタライザ2は、フレームから表示対象であるプリミティブを含む所定の大きさのブロックを取り出し、その後、このブロックをより小さなブロックに分割しつつ、分割したブロックの中からプリミティブに属するピクセルを内包しないブロックを除外し、プリミティブに属するピクセルを内包するブロックを探索する、という描画範囲探索処理を階層的に繰り返す。そして、ラスタライザ2は、この階層的な描画範囲探索処理により得られた各ブロックから、プリミティブに属するピクセル列を求め、そのピクセル列の属性値を生成してピクセル処理部3に供給するのである。
[3.ラスタライザ2の処理内容]
[3−1.ラスタライザ2の処理内容の概略]
図2はラスタライザ2の処理内容を示すフローチャートである。また、図3はフレームに描画するプリミティブを例示する図である。本実施形態では、描画範囲探索処理を階層的に繰り返すことにより、フレーム内においてプリミティブの所在する領域を絞り込み、プリミティブの所在する領域内のピクセルの描画を行う。図2において、ステップS1〜S3の各処理は、この階層的な描画範囲探索処理を実行するための初期設定に相当する。
図4(a)〜(d)は、本実施形態における階層的な描画範囲探索処理の処理内容を例示する図である。最上位階層(第1階層)の描画範囲探索処理S10では、図4(a)に示すように、表示対象のプリミティブを含む所定サイズのブロックを例えばx軸方向のスキャンラインSL_ia、SL_ia+1、…により所定ピクセル幅のブロックに分割する。図4(a)に示す例では、このブロックのピクセル幅を64にしている。そして、分割した各ブロックのうちプリミティブのピクセルを含むブロックY64BLKSTART〜Y64BLKENDの各々について、プリミティブに属するピクセルを含むx軸方向の範囲を探索する(具体的な探索方法は後述する)。このプリミティブのピクセルを含むx軸方向の範囲が第2階層の描画範囲探索処理S10_iの探索範囲となる。
第2階層の描画範囲探索処理S10_iでは、図4(b)に示すように、第1階層の描画範囲探索処理S10において得られたプリミティブのピクセルを含むブロックY64BLKSTART〜Y64BLKENDの各々を例えばy軸方向のスキャンラインSL_ja、SL_ja+1、…により所定ピクセル幅のブロックに分割する。図4(b)に示す例では、このブロックのピクセル幅を64にしている。そして、分割した各ブロックのうちプリミティブのピクセルを含むブロックX64BLKSTART〜X64BLKENDの各々について、プリミティブのピクセルを含むy軸方向の範囲を探索する(具体的な探索方法は後述する)。このプリミティブのピクセルを含むy軸方向の範囲が第3階層の描画範囲探索処理S10_i_jの探索範囲となる。
第3階層の描画範囲探索処理S10_i_jでは、図4(c)に示すように、第2階層の描画範囲探索処理S10_iにおいて得られたプリミティブのピクセルを含むブロックX64BLKSTART〜X64BLKENDの各々を例えばx軸方向のスキャンラインSL_ka、SL_ka+1、…により所定ピクセル幅のブロックに分割する。図4(c)に示す例では、このブロックのピクセル幅を4にしている。そして、分割した各ブロックのうちプリミティブのピクセルを含むブロックの各々について、プリミティブのピクセルを含むx軸方向の範囲を求める。このプリミティブのピクセルを含むx軸方向の範囲が描画範囲となる。図4(d)にこのようにして得られた描画範囲を例示する。第3階層の描画範囲探索処理S10_i_jでは、このようにして求めた描画範囲内の各ピクセルの描画を行う。
以上がラスタライザ2により実行される階層的な描画範囲探索処理の概略である。
[3−2.階層的な描画範囲探索処理を実行するための初期設定]
次に図2のステップS1〜S3の各処理について説明する。プリミティブの各頂点の属性値が与えられると、ラスタライザ2は、まず、スキャンラインとプリミティブの各辺(より正確には各辺またはその延長線)との交点の座標を求めるための関数を発生する(ステップS1)。本実施形態における描画範囲探索処理S10、S10_i、S10_i_jでは、この関数を利用して描画範囲の探索を行う。
次に図3を参照し、このステップS1の処理内容について説明する。図3に示す例において、プリミティブは四角形であり、4個の頂点V0、V1、V2およびV3を有する。そして、xy座標平面において、頂点V0の座標は(x0、y0)、頂点V1の座標は(x1、y1)、頂点V2の座標は(x2、y2)、頂点V3の座標は(x3、y3)となっている。
このxy座標平面上において、頂点V0およびV1間を結ぶ辺およびその延長線上の各点の座標(x、y)は、次式を満たす。
x=((x0−x1)/(y0−y1))y+(x1y0−x0y1)/(y0−y1)
……(1X)
y=((y0−y1)/(x0−x1))x−(x1y0−x0y1)/(x0−x1)
……(1Y)
また、頂点V1およびV2間を結ぶ辺およびその延長線上の各点の座標(x、y)は、次式を満たす。
x=((x1−x2)/(y1−y2))y+(x2y1−x1y2)/(y1−y2)
……(2X)
y=((y1−y2)/(x1−x2))x−(x2y1−x1y2)/(x1−x2)
……(2Y)
また、頂点V2およびV3間を結ぶ辺およびその延長線上の各点の座標(x、y)は、次式を満たす。
x=((x2−x3)/(y2−y3))y+(x3y2−x2y3)/(y2−y3)
……(3X)
y=((y2−y3)/(x2−x3))x−(x3y2−x2y3)/(x2−x3)
……(3Y)
また、頂点V3およびV0間を結ぶ辺およびその延長線上の各点の座標(x、y)は、次式を満たす。
x=((x3−x0)/(y3−y0))y+(x0y3−x3y0)/(y3−y0)
……(4X)
y=((y3−y0)/(x3−x0))x−(x0y3−x3y0)/(x3−x0)
……(4Y)
ステップS1において、ラスタライザ2は、プリミティブの各頂点V0、V1、V2およびV3の座標に基づいて、以上の各式(1X)〜(4Y)に示す各関数を生成する。そして、本実施形態では、任意のy座標を有するx軸方向のスキャンラインとプリミティブの各辺またはその延長線との交点のx座標を求めるために式(1X)、(2X)、(3X)および(4X)に示す各関数を使用する。また、任意のx座標を有するy軸方向のスキャンラインとプリミティブの各辺またはその延長線との交点のy座標を求めるために式(1Y)、(2Y)、(3Y)および(4Y)に示す各関数を使用する。
ステップS1の処理が終了すると、ラスタライザ2は、描画矩形範囲を設定する(ステップS2)。さらに詳述すると、ラスタライザ2は、図3に示すように、プリミティブの各頂点V0、V1、V2およびV3のX座標の最大値VXMAXおよび最小値VXMINと、Y座標の最大値VYMAXおよび最小値VYMINとを求める。そして、ラスタライザ2は、xy座標平面において、直線y=VYMAXおよび直線y=VYMINに挟まれ、かつ、直線x=VXMAXおよび直線x=VXMINに挟まれた領域を描画矩形範囲とする。
次にラスタライザ2は、スキャン方向の初期設定を行う(ステップS3)。具体的には、描画矩形範囲のx軸方向の長さVXMAX−VXMINと、y軸方向の長さVYMAX−VYMINとを比較し、x軸方向の長さがy軸方向の長さよりも短ければスキャン方向をx軸方向とし、そうでなければスキャン方向をy軸方向とする。図3に示す例では、スキャン方向はx軸方向となる。そして、このようにして決定したスキャン方向を第1階層の描画範囲探索処理(ステップS10)のスキャン方向として初期設定する。このようにスキャン方向の初期設定をする理由は次の通りである。
本実施形態のように第1階層〜第3階層の描画範囲探索処理を実行すると、第3階層の描画範囲探索処理における描画方向(描画範囲の開始位置から終了位置までの方向)は、第1階層の描画範囲探索処理のスキャン方向と同じになる。ここで、描画方向に沿ったピクセル列の長さは短くなった方がよい。そこで、本実施形態では、描画矩形範囲のx軸方向の辺とy軸方向の辺のうち短い方の辺を選択し、この辺の延在方向を第1階層の描画範囲探索処理S10のスキャン方向とするのである。
[3−3.第1階層の描画範囲探索処理]
スキャン方向の初期設定が完了すると、ラスタライザ2は、第1階層の描画範囲探索処理(ステップS10)を開始する。上述したように、第1階層の描画範囲探索処理(ステップS10)では、最初に表示対象であるプリミティブを含む所定の大きさのブロックをスキャン方向のスキャンラインにより所定ピクセル幅のブロックに分割する(ステップS11)。図4(a)に示す例では、x軸方向のスキャンラインSL_ia、SL_ia+1、…により上記ブロックを64ピクセル幅のブロックに分割している。
そして、ラスタライザ2は、プリミティブにおいてy座標が最小値VYMINである頂点V0を含むブロックを探索開始ブロックY64BLKSTARTとし、y座標が最大値VYMAXである頂点V2を含むブロックを探索終了ブロックY64BLKENDとする。
次にラスタライザ2は、探索開始ブロックY64BLKSTARTから探索終了ブロックY64BLKENDまでの各ブロックを順次選択し(ステップS12)、ステップS13〜S17の処理を繰り返す。
まず、ラスタライザ2は、ステップS12において選択したブロックについて、当該ブロックをy軸方向両側から挟むスキャンラインSLTおよびSLBのy座標を各々求め、これらのy座標を前掲式(1X)、(2X)、(3X)および(4X)の各関数に代入する(ステップS13)。これによりスキャンラインSLTおよびSLBとプリミティブの各辺またはその延長線との交点のx座標が得られる。ここで、プリミティブが4本の辺を有する場合、このステップS13では、スキャンラインSLTおよびSLBの各々について、4個の交点のx座標が得られる。
次にラスタライザ2は、ステップS13において求めたスキャンラインSLTおよびSLBの各4個の交点の中から下位階層の描画範囲探索処理(この場合、第2階層の描画範囲探索処理S10_i)の探索開始位置候補および探索終了位置候補を求める(ステップS14)。
ここで、図4(a)を参照し、ステップS14の処理の詳細について説明する。例えば探索開始ブロックY64BLKSTARTを挟むスキャンラインSLT=SL_iaおよびSLB=SL_ia+1上の各交点がステップS14の処理対象になっているものとする。
この場合、スキャンラインSLT=SL_ia上には、プリミティブの辺V2−V3の延長線との交点(x座標=cx(2))と、辺V0−V1の延長線との交点(x座標=cx(0))と、辺V3−V0の延長線との交点(x座標=cx(3))と、辺V1−V2の延長線との交点(x座標=cx(1))とが左から順に並ぶ。そして、各交点のx座標の間には、cx(2)<cx(0)<cx(3)<cx(1)の関係がある。そこで、ラスタライザ2は、これら4個のx座標から両端の2個を除き、残った2個のうち小さい方のx座標cx(0)を下位階層の描画範囲探索処理の探索開始位置候補SLT_minとし、大きい方のx座標cx(3)を下位階層の描画範囲探索処理S10_i(i=ia)の探索終了位置候補SLT_maxとする。
一方、スキャンラインSLB=SL_ia+1上には、プリミティブの辺V2−V3の延長線との交点(x座標=cx(2))と、辺V3−V0との交点(x座標=cx(3))と、辺V0−V1との交点(x座標=cx(0))と、辺V1−V2の延長線との交点(x座標=cx(1))とが左から順に並ぶ。そして、各交点のx座標の間には、cx(2)<cx(3)<cx(0)<cx(1)の関係がある。そこで、ラスタライザ2は、これら4個のx座標から両端の2個を除き、残った2個のうち小さい方のx座標cx(3)を下位階層での探索開始位置候補SLB_minとし、大きい方のx座標cx(0)を下位階層の描画範囲探索処理S10_i(i=ia)の探索終了位置候補SLB_maxとする。
以上、ブロックY64BLKSTARTを挟んだスキャンラインSLT=SL_iaおよびSLB=SL_ia+1を例に探索開始位置候補および探索終了位置候補の決定方法を説明したが、他のブロックを挟むスキャンラインSLTおよびSLBについても同様である。
次にラスタライザ2は、ステップS14において求めた探索開始位置候補SLT_minおよびSLB_min、探索終了位置候補SLT_maxおよびSLB_maxに基づいて、下位階層の描画範囲探索処理の探索開始位置と探索終了位置を決定する(ステップS15)。
図5はこのステップS15の処理の詳細を示すフローチャートである。まず、ステップS21において、ラスタライザ2は、プリミティブを囲む辺がブロックを分割する分割線であるスキャンラインSLTとスキャンラインSLBに各々交差しているか否かを判断する。このような判断は、各辺とスキャンラインとの交点のx座標cx(0)〜cx(3)の大小関係に基づいて実行することが可能である。後述するステップS22およびS23についても同様である。
図4(a)に示す例では、例えばスキャンラインSL_ia+1がスキャンラインSLT、スキャンラインSL_ia+2がスキャンラインSLBであるときに、このステップS21の判断結果が「YES」となる。
この場合、ラスタライザ2は、スキャンラインSLT=SL_ia+1とスキャンラインSLB=SL_ia+2との間に挟まれたブロックについて行う下位階層の描画範囲探索処理S10_i(i=ia+1)における探索開始位置と探索終了位置を次のようにして求める。
まず、ラスタライザ2は、スキャンラインSLT=SL_ia+1およびSLB=SL_ia+2間のブロックに含まれるプリミティブの頂点V1のスキャン方向の座標(この例ではx座標)を求める。そして、この頂点V1の座標と、スキャンラインSLT=SL_ia+1から求めた探索開始位置候補SLT_min=cx(3)と、スキャンラインSLB=SL_ia+2から求めた探索開始位置候補SLB_min=cx(3)と、プリミティブ内のブロック境界を比較し、それらのうち最も小さい座標を下位階層の描画範囲探索処理における探索開始位置とする。ここで、プリミティブ内のブロック境界とは、スキャン方向を横切る方向のブロック間の境界である。最上位階層の描画範囲探索処理S10では、このプリミティブ内のブロック境界に相当するものはない。そこで、この例では、スキャンラインSLBから求めた探索開始位置候補SLB_min=cx(3)が下位階層の描画範囲探索処理S10_i(i=ia+1)における探索開始位置となる。
また、ラスタライザ2は、スキャンラインSLT=SL_ia+1およびSLB=SL_ia+2間のプリミティブの頂点V1のスキャン方向の座標(この例ではx座標)と、スキャンラインSLT=SL_ia+1から求めた探索終了位置候補SLT_max=cx(0)と、スキャンラインSLB=SL_ia+2から求めた探索終了位置候補SLB_max=cx(1)と、プリミティブ内のブロック境界とを比較し、それらのうち最も大きい座標を下位階層の描画範囲探索処理S10_i(i=ia+1)における探索終了位置とする。この例では、頂点V1のx座標が下位階層の描画範囲探索処理S10_i(i=ia+1)における探索終了位置となる。
図4(a)に示す例において、スキャンラインSL_ia+2がスキャンラインSLT、スキャンラインSL_ia+3がスキャンラインSLBであるときにも、ステップS21の判断結果が「YES」となる。
この場合、頂点V3のx座標が下位階層の描画範囲探索処理S10_i(i=ia+2)における探索開始位置となる。また、スキャンラインSLT=SL_ia+2から求めた探索終了位置候補SLT_max=cx(1)が下位階層の描画範囲探索処理S10_i(i=ia+2)における探索終了位置となる。
ステップS21の判断結果が「NO」である場合はステップS22に進む。このステップS22において、ラスタライザ2は、プリミティブを囲む辺がスキャンラインSLTのみに交差しているか否かを判断する。
図4(a)に示す例では、スキャンラインSL_ia+3がスキャンラインSLT、スキャンラインSL_ia+4がスキャンラインSLBであるときに、このステップS22の判断結果が「YES」となる。
この場合、ラスタライザ2は、スキャンラインSLT=SL_ia+3およびSLB=SL_ia+4間のブロックY64BLKSENDに含まれるプリミティブの頂点V2のスキャン方向の座標(この例ではx座標)を求める。そして、この頂点V2の座標と、スキャンラインSLT=SL_ia+3から求めた探索開始位置候補SLT_min=cx(2)と、プリミティブ内のブロック境界とを比較し、それらのうち最も小さい座標を下位階層の描画範囲探索処理S10_i(i=ia+3)における探索開始位置とする。この例では、スキャンラインSLT=SL_ia+3から求めた探索開始位置候補SLT_min=cx(2)が下位階層の描画範囲探索処理S10_i(i=ia+3)における探索開始位置となる。
また、ラスタライザ2は、スキャンラインSLT=SL_ia+3およびスキャンラインSLB=SL_ia+4間のプリミティブの頂点V2のスキャン方向の座標(この例ではx座標)と、スキャンラインSLT=SL_ia+3から求めた探索終了位置候補SLT_max=cx(1)と、プリミティブ内のブロック境界とを比較し、それらのうち最も大きい座標を下位階層の描画範囲探索処理S10_i(i=ia+3)における探索終了位置とする。この例では、スキャンラインSLT=SL_ia+3から求めた探索終了位置候補SLT_max=cx(1)が下位階層の描画範囲探索処理S10_i(i=ia+3)における探索終了位置となる。
ステップS22の判断結果が「NO」である場合はステップS23に進む。このステップS23において、ラスタライザ2は、プリミティブを囲む辺がスキャンラインSLBのみに交差しているか否かを判断する。
図4(a)に示す例では、スキャンラインSL_iaがスキャンラインSLT、スキャンラインSL_ia+1がスキャンラインSLBであるときに、このステップS23の判断結果が「YES」となる。
この場合、ラスタライザ2は、スキャンラインSLT=SL_iaおよびスキャンラインSLB=SL_ia+1間のブロックY64BLKSTARTに含まれるプリミティブの頂点V0のスキャン方向の座標(この例ではx座標)を求める。そして、この頂点V0の座標と、スキャンラインSLB=SL_ia+1から求めた探索開始位置候補SLB_min=cx(3)と、プリミティブ内のブロック境界とを比較し、それらのうち最も小さい座標を下位階層の描画範囲探索処理S10_i(i=ia)における探索開始位置とする。この例では、スキャンラインSLB=SL_ia+1から求めた探索開始位置候補SLB_min=cx(3)が下位階層の描画範囲探索処理S10_i(i=ia)における探索開始位置となる。
また、ラスタライザ2は、スキャンラインSLT=SL_iaおよびSLB=SL_ia+1間のプリミティブの頂点V0のスキャン方向の座標(この例ではx座標)と、スキャンラインSLB=SL_ia+1から求めた探索終了位置候補SLB_max=cx(0)と、プリミティブ内のブロック境界とを比較し、それらのうち最も大きい座標を下位階層の描画範囲探索処理S10_i(i=ia)における探索終了位置とする。この例では、スキャンラインSLB=SL_ia+1から求めた探索終了位置候補SLB_max=cx(0)が下位階層の描画範囲探索処理S10_i(i=ia)における探索終了位置となる。
ステップS23の判断結果が「NO」になる場合として、スキャンラインSLTおよびSLB間にプリミティブ全体が収まっている場合と、全てのブロック境界がプリミティブ内に収まっている場合がある(図示略)。前者の場合、ラスタライザ2は、スキャンラインSLTおよびSLB間のブロックに含まれるプリミティブの各頂点を求める。そして、スキャン方向の各頂点の座標の最小値を下位階層の描画範囲探索処理S10_iにおける探索開始位置とし、スキャン方向の各頂点の座標の最大値を探索終了位置とする。また、後者の場合、ラスタライザ2は、プリミティブ内の各ブロック境界のスキャン方向の座標の最小値を下位階層の描画範囲探索処理S10_iにおける探索開始位置とし、最大値を探索終了位置とする。
以上が図2のステップS15の処理内容の詳細である。
ステップS15の処理が終了すると、ステップS16に進む。このステップS16において、ラスタライザ2は、上側スキャンラインSLTおよび下側スキャンラインSLBにより挟まれたブロックのサイズが描画可能なサイズか否かを判断する。第1階層の描画範囲探索処理S10では、ブロックのサイズが大きく、描画可能なサイズではない。図4に示す例では4ピクセル幅のブロックのサイズを描画可能なサイズとしているからである。このため、ステップS16の判断結果が「NO」となり、ラスタライザ2は、第2階層の描画範囲探索処理S10_iを実行する。
[3−4.第2階層の描画範囲探索処理]
第1階層でのスキャン方向がx軸方向であった場合、ラスタライザ2は、第2階層の描画範囲探索処理S10_iにおけるスキャン方向をy軸方向とする。一方、第1階層でのスキャン方向がy軸方向であった場合、ラスタライザ2は、第2階層の描画範囲探索処理S10_iにおけるスキャン方向をx軸方向とする。
また、第1階層の描画範囲探索処理S10において、スキャンラインSLTが例えば図4(a)のスキャンラインSL_ia、スキャンラインSLBがスキャンラインSL_ia+1であるときに、ステップS16の判断結果が「NO」となった場合、ラスタライザ2は、スキャンラインSLT=SL_iaおよびSLB=SL_ia+1間のブロックにおいて、ステップS15により決定された探索開始位置、探索終了位置を含む領域を処理対象とする第2階層の描画範囲探索処理S10_i(i=ia)を実行する。
ここで、図4(b)を参照し、第2階層の描画範囲探索処理S10_i(i=ia)の処理内容の概略を説明する。この第2階層の描画範囲探索処理S10_iは、第1階層の描画範囲探索処理S10と同様なステップS11〜S17の処理により構成されている。このため、第2階層の描画範囲探索処理S10_iでは、第1階層の描画範囲探索処理S10を実行するために利用される演算手段と同じ演算手段が利用される。
第2階層のスキャン方向がy軸方向である場合、第2階層の描画範囲探索処理S10_i(i=ia)のステップS11では、スキャンラインSLT=SL_iaおよびSLB=SL_ia+1間のブロックをy軸方向のスキャンラインにより所定ピクセル幅のブロックに分割する。図4(b)に示す例では、y軸方向のスキャンラインSL_ja、SL_ja+1、SL_ja+2によりブロックY64BLKSTARTを64×64ピクセルの2つのブロックに分割している。
そして、ラスタライザ2は、第1階層の描画範囲探索処理S10のステップS15において求めた探索開始位置cx(3)を含むブロックを探索開始ブロックX64BLKSTARTとし、探索終了位置cx(0)を含むブロックを探索終了ブロックX64BLKENDとする。
次にラスタライザ2は、スキャン方向に対して垂直な方向(この例ではx軸方向)に並んだ探索開始ブロックX64BLKSTARTから探索終了ブロックX64BLKENDまでの各ブロックを順次選択し(ステップS12)、ステップS13〜S17の処理を繰り返す。このステップS13〜S17の処理内容は、第1階層の描画範囲探索処理S10のステップS13〜S17の処理内容と基本的に同様である。
ただし、第2階層の描画範囲探索処理S10_i(i=ia)では、ステップS13において前掲式(1Y)、(2Y)、(3Y)および(4Y)の各関数を利用し、y軸方向のスキャンラインSLTおよびSLBとプリミティブの各辺またはその延長線との交点のy座標を算出する。そして、ステップS14およびS15では、y軸方向の探索開始位置および探索終了位置を求める。
図4(b)に示す例では、プリミティブの辺とスキャンラインSL_ja+1との交点のy座標cy(3)を探索開始位置、スキャンラインSL_ja+1上のブロック境界のy座標を探索終了位置とする探索範囲がステップS15の処理により求められている。
第1階層の描画範囲探索処理S10と同様、第2階層の描画範囲探索処理S10_i(i=ia)のステップS16では、ステップS11で分割されたブロックのサイズが描画可能なサイズであるか否かを判断する。本実施形態では、第2階層のブロックサイズは、64×64ピクセルであり、描画可能なブロックサイズではない。そこで、ラスタライザ2は、第2階層の描画範囲探索処理S10_i(i=ia)のステップS16において、第3階層の描画範囲探索処理S10_i_jを実行する。
[3−5.第3階層の描画範囲探索処理]
第2階層でのスキャン方向がy軸方向であった場合、ラスタライザ2は、第3階層の描画範囲探索処理S10_i_jにおけるスキャン方向をx軸方向とする。一方、第2階層でのスキャン方向がx軸方向であった場合、ラスタライザ2は、第3階層の描画範囲探索処理S10_i_jにおけるスキャン方向をy軸方向とする。
また、スキャンラインSLTが例えば図4(b)のスキャンラインSL_ja、スキャンラインSLBがスキャンラインSL_ja+1であるときに、ステップS16の判断結果が「NO」となった場合、ラスタライザ2は、スキャンラインSLT=SL_jaおよびSLB=SL_ja+1間のブロックにおいて、ステップS15により決定された探索開始位置、探索終了位置を含む領域を処理対象とする第3階層の描画範囲探索処理S10_i_j(i=ia、j=ja)を実行する。
ここで、図4(c)を参照し、第3階層の描画範囲探索処理S10_i_j(i=ia、j=ja)の処理内容の概略を説明する。この第3階層の描画範囲探索処理S10_i_jも、第1階層の描画範囲探索処理S10と同様なステップS11〜S17の処理により構成されている。このため、第3階層の描画範囲探索処理S10_i_jにおいても、第1階層の描画範囲探索処理S10を実行するために利用される演算手段と同じ演算手段が利用される。
第2階層のスキャン方向がy軸方向である場合、第3階層の描画範囲探索処理S10_i_j(i=ia、j=ja)のステップS11では、スキャンラインSLT=SL_jaおよびSLB=SL_ja+1間のブロックにおいて、探索により狭められた範囲内の領域をx軸方向のスキャンラインにより所定ピクセル幅のブロックに分割する。図4(c)に示す例では、x軸方向のスキャンラインSL_ka、SL_ka+1、…によりブロックX64BLKSTARTを4×64ピクセルのブロックに分割している。
そして、ラスタライザ2は、第2階層の描画範囲探索処理S10_i(i=ia)のステップS15において求めた探索開始位置cy(3)を含むブロックを探索開始ブロックとし、探索終了位置(この例ではスキャンラインSL_ia+1上のブロック境界)を含むブロックを探索終了ブロックとする。
次にラスタライザ2は、スキャン方向に対して垂直な方向(この例ではy軸方向)に並んだ探索開始ブロックから探索終了ブロックまでの各ブロックを順次選択し(ステップS12)、ステップS13〜S17の処理を繰り返す。このステップS13〜S17の処理内容は、第1階層の描画範囲探索処理S10のステップS13〜S17の処理内容と基本的に同様である。そして、ステップS14およびS15では、x軸方向の探索開始位置および探索終了位置を求める。
第1階層の描画範囲探索処理S10と同様、第3階層の描画範囲探索処理S10_i_j(i=ia、j=ja)のステップS16では、ステップS11で分割されたブロックのサイズが描画可能なサイズであるか否かを判断する。本実施形態において、第3階層のブロックサイズは、4×64ピクセルであり、描画可能なブロックサイズである。
このため、第3階層の描画範囲探索処理S10_i_j(i=ia、j=ja)のステップS16の判断結果は「YES」となり、ラスタライザ2は、ステップS17の描画処理を実行する。
この描画処理では、ステップS15において求めた探索開始位置から探索終了位置までの範囲を描画範囲とし、この描画範囲内の各ピクセルの属性値をプリミティブの頂点V0、V1、V2、V3の属性値を用いた補間演算により算出する。そして、算出した各ピクセルの属性値をピクセル処理部3に出力する。
図4(d)は、図4(c)のスキャンラインSL_kaおよびSL_ka+1間の4×64ピクセルのブロックの内容を例示している。この例では、第3階層の描画範囲探索処理S10_i_j(i=ia、j=ja)のステップS15の処理の結果、4×64ピクセルのブロックの中の左から15番目の4×4ピクセルのブロック内の位置が探索開始位置となり、16番目の4×4ピクセルのブロックの右側のブロック境界が探索終了位置となる。そこで、ラスタライザ2は、ステップS17において、この15番目〜16番目までの4×4ピクセルのブロックについて、描画処理を実行する。
描画処理(ステップS17)が終了すると、ステップS12に戻り、スキャンラインSL_ka+1およびSL_ka+2間の4×64ピクセルのブロックについて同様な処理を実行する。
[3−6.下位階層から上位階層への復帰]
第3階層の描画範囲探索処理において、探索開始ブロックから探索終了ブロックまでの各ブロックについて描画処理(ステップS17)を実行すると、第3階層の描画範囲探索処理から第2階層の描画範囲探索処理S10_i(i=ia)に戻る。
第2階層の描画範囲探索処理S10_i(i=ia)では、j=ja+1として(すなわち、SLT=SL_ja+1、SLB=SL_ja+2として)、探索開始ブロックから探索終了ブロックまでの各ブロックについてステップS12〜S16の処理を実行する。そして、ステップS16において第3階層の描画探索処理S10_i_j(i=ia、j=ja+1)を実行し、ブロックX64BLKENDのプリミティブ内の描画処理を実行する(ステップS17)。
このようにして第2階層の描画範囲探索処理S10_i(i=ia)が終了すると、第1階層の描画範囲探索処理S10に戻る。そして、第1階層の描画範囲探索処理S10では、i=ia+1として(すなわち、SLT=SL_ia+1、SLB=SL_ia+2として)、探索開始ブロックから探索終了ブロックまでの各ブロックについてステップS12〜S16の処理を実行する。
以下、同様である。
ラスタライザ2は、以上のようにして、ブロックを分割しつつ、プリミティブが占めるブロックを探索し、適切なサイズに分割されたブロック内のプリミティブのピクセル列の描画を行う。
[3−7.ジグザグスキャン]
本実施形態においてラスタライザ2は、第2階層の描画範囲探索処理S10_iを実行する際、処理対象であるブロックを図6および図7に例示するようにジグザグにスキャンする。
図6に示す例では、三角形のプリミティブがy軸方向に長いため、描画矩形範囲の短辺方向であるx軸方向をスキャン方向として、第1階層の描画範囲探索処理S10を実行している。そして、1回目の第2階層の描画範囲探索処理S10_iでは、最上行の2個のブロックを左から右へ処理した後、第2行の第1階層の描画範囲探索処理S10を経て、処理対象を第2行に切り換えて、2回目の第2階層の描画範囲探索処理S10_iを実行するとき、処理対象である2個のブロックを右から左へ順に処理している。そして、図6に示す例では、1回目の第2階層の描画範囲探索処理S10_iを実行した後、第2行の第1階層の描画範囲探索処理S10を経て、2回目の第2階層の描画範囲探索処理S10_iを実行するとき、1回目の最後に処理したブロックとy軸方向に隣接したブロックを2回目の第2階層の描画範囲探索処理S10_iにおいて最初に処理する。第2行から第3行への切り換わり、第3行から第4行への切り換わりについても同様である。
図7に示す例では、三角形のプリミティブがx軸方向に長いため、描画矩形範囲の短辺方向であるy軸方向をスキャン方向として、第1階層の描画範囲探索処理S10を実行している。そして、1回目の第2階層の描画範囲探索処理S10_iでは、最左列の2個のブロックを上から下へ処理した後、第2列の第1階層の描画範囲探索処理S10を経て、処理対象を第2列に切り換えて、2回目の第2階層の描画範囲探索処理S10_iを実行するとき、処理対象である2個のブロックを下から上へ順に処理している。そして、図7に示す例では、1回目の第2階層の描画範囲探索処理S10_iを実行した後、第2列の第1階層の描画範囲探索処理S10を経て、2回目の第2階層の描画範囲探索処理S10_iを実行するとき、1回目の最後に処理したブロックとx軸方向に隣接したブロックを2回目の第2階層の描画範囲探索処理S10_iにおいて最初に処理する。第2列から第3列への切り換わり、第3列から第4列への切り換わりについても同様である。
このように第2階層の描画範囲探索処理S10_iを繰り返すときに処理対象であるブロックのジグザグスキャンを行うと、常に描画対象としたブロックに隣接するブロックを新たな描画対象とすることになる。従って、フレームメモリ等のアクセス効率を低下させることなく描画処理を実行することができる。
[4.本実施形態の効果]
図8および図9は、三角形のプリミティブを処理対象とした描画範囲探索処理の実行例を示すものである。これらの図において、E1は第1階層の描画範囲探索処理S10のステップS11〜S16の処理対象となった範囲、E2は第2階層の描画範囲探索処理S10_iにおいて求められた描画探索範囲、E3は第3階層の描画範囲探索処理において求められた描画探索範囲(すなわち、描画範囲)を示している。このように本実施形態によれば、描画探索範囲の分割および探索を階層的に繰り返して、プリミティブが占める描画範囲を求めるので、フレームメモリのアクセス効率を低下させることなく、少ない処理量で描画処理を実行することができる。また、本実施形態によれば、階層的な描画範囲探索処理を共通の演算手段により実行することができるので、画像処理装置の小規模化を図ることができる。
<第2実施形態>
この発明の第2実施形態による画像処理装置は、アンチエイリアスフィルタ処理に適した描画処理を可能にするものである。まず、図10〜図11を参照し、本実施形態におけるラスタライザによって実行されるアンチエイリアスフィルタ処理について説明する。図10には、描画対象である直線が示されている。本実施形態では、この直線と重複した領域を占める各ピクセルからなる領域を描画範囲とし、この描画範囲の外側にピクセル1個分だけはみ出した範囲を拡張された描画範囲とする。そして、本実施形態では、この拡張された描画範囲の各ピクセルにより描画対象である直線を表現する。
図11には3×3ピクセルの領域を描画対象の直線が横切っている様子が示されている。各ピクセルには、4個のサブピクセルが設定されている。図11において、xマークは、直線の中に含まれていないサブピクセルであり、丸囲みされたxマークは直線の中に含まれているサブピクセルである。
図11では、3×3ピクセルの中央のピクセルがアンチエイリアスフィルタ処理の対象ピクセルとなっている。そして、アンチエイリアスフィルタ処理を実行するため、対象ピクセルを囲むカバレッジ領域R0と、このカバレッジ領域R0を内包するカバレッジ領域R1と、このカバレッジ領域R1を内包するカバレッジ領域R2と、このカバレッジ領域R2を内包するカバレッジ領域R3と、このカバレッジ領域R3を内包するカバレッジ領域R4とが設定されている。
そして、アンチエイリアスフィルタ処理では、各カバレッジ領域R0〜R4において、当該カバレッジ領域に含まれているサブピクセルの個数と、それらのサブピクセルのうち直線の中に含まれているサブピクセルの個数(すなわち、描画対象サブピクセル個数)との比が求められ、それらの比に基づいて、対象ピクセルのカラーデータに乗算する重み係数Coverageが決定される。より具体的には、次式に従って重み係数Coverageが算出される。
Coverage
= (R0内の描画対象サブピクセル個数/R0内のサブピクセル個数)/5
+(R1内の描画対象サブピクセル個数/R1内のサブピクセル個数)/5
+(R2内の描画対象サブピクセル個数/R2内のサブピクセル個数)/5
+(R3内の描画対象サブピクセル個数/R3内のサブピクセル個数)/5
+(R4内の描画対象サブピクセル個数/R4内のサブピクセル個数)/5
……(5)
以上の処理を全てのピクセルについて実行し、それにより得られる重み係数Coverageを当該ピクセルのカラーデータに乗算する。これにより描画対象である直線の輪郭のギザギザを緩和し、直線の画像を滑らかにすることができる。以上、直線を例に説明したが、プリミティブに対してもアンチエイリアスフィルタ処理を施すことにより、プリミテティブの集合により近似されたオブジェクトの輪郭線をギザギザの緩和された滑らかな線にすることができる。なお、このアンチエイリアスフィルタ処理は非特許文献1に開示されている。
本実施形態は、以上説明したアンチエイリアスフィルタ処理の実行に適した描画処理を提供するものである。本実施形態におけるアンチエイリアスフィルタ処理では、描画対象のピクセルと、この描画対象ピクセルを囲む8個のピクセルについて、当該ピクセル内のサブピクセルが描画対象範囲内に含まれるか否かの内外判定を行う。そこで、本実施形態では、アンチエイリアスフィルタ処理において内外判定に必要なピクセルを取得するために、描画対象であるプリミティブが占める領域よりも、階層的な描画範囲探索処理により求められる描画範囲を広くし、後者の描画範囲に前者の領域に対する余裕を設ける。
図12は本実施形態における描画範囲探索処理の実行例を示す図である。図12に示す例では、描画対象のプリミティブにおいて、x軸方向の探索開始位置となる頂点のx座標IVXMINをIVXMIN−1とし、x軸方向の探索終了位置となる頂点のx座標IVXMAXをIVXMAX+1とし、この2頂点のx軸方向外側への移動に合わせて、プリミティブの各辺を平行移動させている。また、スキャンラインSLTおよびSLBを上下方向外側に1ピクセルだけシフトしている。また、プリミティブの上下の2頂点を各々上方および下方に1ピクセルずつ移動させている。このような操作により、本来のプリミティブの辺の約1ピクセルだけ外側に辺のある多角形が得られる。本実施形態では、このようにして得られた多角形内のピクセルを描画対象とし、その描画処理においてアンチエイリアスフィルタ処理を実行する。このように本実施形態によれば、プリミティブの外周部を通常より拡張し、アンチエイリアスフィルタ処理に必要なピクセルを描画対象とすることができる。
<他の実施形態>
以上、この発明の各種の実施形態について説明したが、この発明には他にも実施形態が考えられる。例えば次の通りである。
(1)各階層の描画範囲探索処理において、処理対象のブロックを分割する際のスキャンラインSLTおよびSLB間のピクセル幅を描画対象のプリミティブのサイズ等に応じて可変制御するようにしてもよい。
(2)上記第1実施形態の画像処理装置100を例えばパーソナルコンピュータに搭載する際、ジオメトリ処理部1が実行する演算処理の一部または全部をパーソナルコンピュータのCPUに実行させてもよい。
(3)上記各実施形態において、第3階層の描画範囲探索処理S10_i_jのステップS17において実行する描画処理は、処理量が多く、時間の掛かる処理である。そこで、第1〜第3階層の描画範囲探索処理(第3階層では描画処理(ステップS17)を除いた部分)と、第3階層の描画処理(ステップS17)とを例えば異なるハードウェアにより並列実行するようにしてもよい。この態様によれば、描画処理の効率をさらに高めることができる。
(4)上記各実施形態では、階層数を3階層とし、第1階層〜第3階層の描画範囲探索処理を実行したが、階層数を4階層、5階層という具合に3階層より多くしてもよい。また、上記各実施形態では、第1階層においてブロックを64ピクセル幅のブロックに分割し、第2階層では第1階層において分割されたブロックを64プクセル幅のブロックに分割し、第3階層では第2階層において分割されたブロックを4プクセル幅のブロックに分割した。しかし、これは1つの分割例であり、各階層における分割後のブロックのサイズは、ディスプレイのピクセル数やフレームメモリのメモリアクセス単位を考慮して適切に定めればよい。