基本情報技術者 2023年 科目A 問05
問題文
3次元グラフィックス処理におけるクリッピングの説明はどれか。
選択肢
ア:CG映像作成における最終段階として、物体のデータをディスプレイに描画できるように映像化する処理である。
イ:画像表示領域にウィンドウを定義し、ウィンドウの外側を除去し、内側の見える部分だけを取り出す処理である。(正解)
ウ:スクリーンの画素数が有限であるために図形の境界近くに生じる、階段状のギザギザを目立たなくする処理である。
エ:立体感を生じさせるために、物体の表面に陰影を付ける処理である。
🔒 解説は解答すると表示されます
クリッピング処理【午前解説】
正解の理由
3次元グラフィックスにおけるクリッピングは、描画対象のうち「表示領域(ウィンドウ/ビューポート)や視錐台の外側にある部分を取り除く」処理です。選択肢の中ではウィンドウ外側を除去して内側だけを取り出す説明が該当するため、イが正解です。クリッピングはレンダリングパイプラインの投影変換後・ラスタライズ前に行われ、画面に描かれない部分を切り落とすことで以降の処理(ラスタライズ、深度テストなど)を効率化します。
解法ステップ
- 問題文のキーワードを抽出する(例:「ウィンドウの外側を除去」「見える部分だけを取り出す」)。
- 各選択肢をグラフィックス処理の用語と照合する:
- 描画全体の最終化=レンダリング/ラスタライズ
- ウィンドウ外を切る=クリッピング
- 境界のギザギザを目立たなくする=アンチエイリアシング
- 陰影付け=シェーディング/ライティング
- 一致する用語が「ウィンドウ外の除去」を説明する選択肢であることを確認する。
選択肢別の誤答解説
- ア: 「物体のデータをディスプレイに描画できるように映像化する処理」はレンダリングやラスタライズの説明です。ピクセル生成や色計算を含むため、クリッピングとは異なります。
- イ: 表示領域(ウィンドウ/ビューポート)や視錐台の外側を切り落とし、内部の可視部分だけを残す処理であり、正解です。
- ウ: 「境界近くのギザギザを目立たなくする処理」はアンチエイリアシング(エイリアシング低減)の説明です。クリッピングとは目的が異なります。
- エ: 「物体の表面に陰影を付ける処理」はシェーディング(ライティングや法線を使った陰影計算)の説明であり、クリッピングではありません。
よくある誤解
- クリッピングとカリングを混同する:クリッピングは部分的に切り落とす処理(ウィンドウとの交差部分を求める)で、カリング(例:バックスフェースカリング、オクルージョンカリング)は描画対象全体を除外して描画負荷を減らす技術です。目的や適用条件が異なります。
- クリッピングは「描画をきれいにする」処理と思い込む:見た目の改善(アンチエイリアシング)ではなく、見えない部分を計算コストの無駄にしないための幾何処理です。
- クリッピングは必ず画面空間で行うと思う:実際にはクリップ空間(同次座標で -w ≤ x,y,z ≤ w の範囲)で行い、遠近投影の前後や同次除算のタイミングなど設計によって異なります。
補足コラム
主なクリッピングアルゴリズム:
- Cohen–Sutherland(ラインのウィンドウクリップ、領域コードを用いる)
- Liang–Barsky(パラメトリック線分式で効率的)
- Sutherland–Hodgman(多角形のウィンドウクリップ)
- 同次座標クリッピング(3Dグラフィックスでは視錐台クリッピングを同次座標で行い、-w〜wで判定)
クリッピングはレンダリングパイプラインで投影変換の直後や同次除算の前後で行われることが多く、CPUやGPUで高速に実装されます。視錐台クリッピングでは、各頂点の同次座標 に対し
の判定を行い、外側の部分は切り落とします。
参考として2D線分クリップ(Cohen–Sutherland)を簡略化した擬似コード:
# 簡易版: outcodeを計算して繰り返し判定
INSIDE = 0; LEFT=1; RIGHT=2; BOTTOM=4; TOP=8
def compute_outcode(x, y, xmin, xmax, ymin, ymax):
code = INSIDE
if x < xmin: code |= LEFT
elif x > xmax: code |= RIGHT
if y < ymin: code |= BOTTOM
elif y > ymax: code |= TOP
return code
def cohen_sutherland_clip(x0,y0,x1,y1,xmin,xmax,ymin,ymax):
out0 = compute_outcode(x0,y0,xmin,xmax,ymin,ymax)
out1 = compute_outcode(x1,y1,xmin,xmax,ymin,ymax)
while True:
if out0 == 0 and out1 == 0:
return (x0,y0,x1,y1) # 完全内部
if (out0 & out1) != 0:
return None # 完全外部
# ここで端点を交点まで移動して繰り返す(省略)
FAQ
Q: クリッピングはどの段階で行うのが一般的ですか?
A: 多くのパイプラインでは投影変換の直後、同次座標で視錐台クリップを行い、その後同次除算(NDC変換)を行います。ただし実装により細かい順序は異なります。
A: 多くのパイプラインでは投影変換の直後、同次座標で視錐台クリップを行い、その後同次除算(NDC変換)を行います。ただし実装により細かい順序は異なります。
Q: クリッピングで完全に見えないオブジェクトを消せますか?
A: クリッピングはウィンドウや視錐台に基づく幾何の切断を行います。完全に視錐台外にあるオブジェクトはクリップで除去されますが、視錐台内で隠れている(他のオブジェクトに遮られている)場合はオクルージョン処理や深度テストが必要です。
A: クリッピングはウィンドウや視錐台に基づく幾何の切断を行います。完全に視錐台外にあるオブジェクトはクリップで除去されますが、視錐台内で隠れている(他のオブジェクトに遮られている)場合はオクルージョン処理や深度テストが必要です。
Q: クリッピングとスカッシング(scissoring)の違いは?
A: スカッシングはピクセルレベルで描画範囲を単純に矩形に限定する処理(ラスタライズ時のクリップ矩形)で、クリッピングはジオメトリ(線・多角形)を境界で切断して交差部分を計算する幾何的処理です。
A: スカッシングはピクセルレベルで描画範囲を単純に矩形に限定する処理(ラスタライズ時のクリップ矩形)で、クリッピングはジオメトリ(線・多角形)を境界で切断して交差部分を計算する幾何的処理です。
関連キーワード: クリッピング、視錐台、ビューポート、Sutherland–Hodgman、Cohen–Sutherland、アンチエイリアシング、シェーディング

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

